O que esse code string.format faz?
-
22-09-2019 - |
Pergunta
Eu tenho este pedaço de código em 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()));
}
Estou tentando entender qual a parte que começa com "getColumnName?" e termina com ".ToString ()" faz. Entendi que é um tipo de sistema. Eu quero isso por causa disso: "Leitor" tinha várias linhas e quero escrever apenas linhas específicas.
Se alguém puder me ajudar em qualquer um deles, eu ficaria agradecido.
Solução
A função itera todas as colunas do leitor de dados e, em seguida, para cada uma:
Se getColumnName
Retorna true, ele gera o nome da coluna entre o <td>
tags, caso contrário, o valor dos dados.
Para desconstruir ainda mais:
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)
Outras dicas
Isto é um operador condicional. Diz se getColumnName
é verdadeiro, então use reader.GetName(i)
Caso contrário, use reader.GetValue(i).ToString()
O formato é o seguinte:
ThingToCheck ? UseIfCheckIsTrue : UseIfCheckIsFalse
No código, parece getColumnName
é verdadeiro Para a linha do cabeçalho, por isso está emitindo o nome da coluna e chamado novamente para todas as outras linhas usando falso, para produzir os valores.
Isso é chamado de operador condicional.
O argumento getColumnName
é avaliado e se for verdade, o primeiro argumento após o ?
é devolvido, se falso, o segundo.
Então, se getColumnName == true, você vai ver <td>NAME</td>
senão <td>Value</td>
Faz sentido?
É 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()
}
Porque getColumnName é do tipo bool, então não há necessidade de testá -lo como
If (getColumnName == true)
Você pode escrever isso como
If (getColumnName)
String.Format (String, Método)
E o método String.Format substitui os itens na sequência especificada pelo objeto especificado, este método possui dois argumentos primeiro é o objeto e o segundo é o objeto. por exemplo
string.Format("Question number {0} is answered by {1} {2}", 11, "Adam", "Yesterday");
O put ser será
A pergunta número 11 é respondida por Adam ontem
Como você pode ver, {0} é substituído por 11 e {1} é substituído por Adam e {2} é substituído por ontem.
você pode ler mais sobre isso aqui
isto é operador ternário, usado para a constituição do ADHOC de se o bloco.