¿qué hace esta pieza string.format de código?
-
22-09-2019 - |
Pregunta
Tengo este pedazo de código en C #:
private static void _constructRow(SqlDataReader reader, system.IO.StreamWriter stwr, bool getColumnName)
{
for (int i = 0; i < reader.FieldCount; i++)
stwr.Writeline(String.Format("<td>{0}</td"), getColumnName ? reader.GetName(i) : reader.GetValue(i).ToString()));
}
Estoy tratando de entender lo que la parte que comienzan con "getColumnName?" y termina con ".ToString ()" hace. Me entendido que es un tipo System.Object, pero no tengo ni idea de lo que hace específicamente o cómo funciona. Quiero que debido a este: "lector" tenía varias filas en ella, y quiero writeLine sólo filas específicas
.Si alguien me puede ayudar en cualquiera de esos, te agradecería.
Solución
Los itera función sobre todas las columnas en el lector de datos, a continuación, para cada uno:
Si se vuelve a getColumnName
cierto, que emite el nombre de la columna entre las etiquetas <td>
, de lo contrario el valor de los datos.
Para des-constructo además:
reader.GetName(i) - this returns the name of the column
reader.GetValue(i).ToString() - this returns the value of the column as a string
getColumnName - a function the will return true if a column name can be gotten
?: - the conditional operator. If the expression before the ? is true, the expression to the left of the : is used, otherwise the one on the right
String.Format("<td>{0}</td", arg) - this will output "<td>arg</td>" (btw - your code is wrong, the ) should not be just after the first string)
Otros consejos
Este es un condicional operador . Se dice que si getColumnName
es cierto, entonces el uso reader.GetName(i)
utilizar de otro modo reader.GetValue(i).ToString()
El formato es el siguiente:
ThingToCheck ? UseIfCheckIsTrue : UseIfCheckIsFalse
En el código, parece que getColumnName
es true de la fila de encabezado, por lo que es la salida del nombre de la columna y se llama de nuevo para todas las demás filas usando false , a la salida los valores.
Eso se llama un operador condicional.
El getColumnName
argumento se evalúa y si es verdad, se devuelve el primer argumento después de la ?
, si es falso, el segundo.
Por lo tanto, si getColumnName == true, se le va a ver otra cosa <td>NAME</td>
<td>Value</td>
sentido?
Es como seguir
if (getColumnName == true)
{
reader.GetName(i); // GetName is string so no need to convert this in string I.E ToString()
}
else
{
reader.GetValue(i).ToString(); // GetValue returns object so this needs to convert in string using .ToString()
}
Debido getColumnName es de tipo bool así que no hay necesidad de probar que como
If (getColumnName == true)
Se puede escribir esto como
If (getColumnName)
String.Format (cadena, método)
Reemplazay el método String.Format artículos en cadena especificada con el objeto dado, este método tiene dos argumentos primera de ellas es la cadena y el segundo es objeto. por ejemplo
string.Format("Question number {0} is answered by {1} {2}", 11, "Adam", "Yesterday");
El apagada, será
La pregunta número 11 es contestada por Adam Ayer
Como se puede ver {0} se reemplaza con 11 y {1} se reemplaza con Adán y {2} se sustituye con el ayer.
Puede leer más sobre este aquí
este es ternario operador, usado para la constitución ad hoc de si el bloque más.