что делает этот фрагмент кода string.format?
-
22-09-2019 - |
Вопрос
У меня есть этот фрагмент кода на С#:
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()));
}
Я пытаюсь понять, какую часть начинается с "GetColumnName?" и заканчивается ".toString ()" делает.Я понял, что это тип system.object, но понятия не имею, что конкретно он делает и как работает.Я хочу этого из-за этого:В «читателе» было несколько строк, и я хочу записать только определенные строки.
Если кто-нибудь может помочь мне в любом из этих вопросов, я был бы благодарен.
Решение
Функция выполняет итерацию по всем столбцам в средстве чтения данных, а затем по каждому из них:
Если getColumnName
возвращает true, он выводит имя столбца между <td>
теги, в противном случае значение данных.
Чтобы деконструировать дальше:
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)
Другие советы
Это условный оператор.Там написано, если getColumnName
верно, то используйте reader.GetName(i)
в противном случае используйте reader.GetValue(i).ToString()
Формат такой:
ThingToCheck ? UseIfCheckIsTrue : UseIfCheckIsFalse
В коде это выглядит так getColumnName
является истинный для строки заголовка, поэтому он выводит имя столбца и снова вызывается для всех остальных строк, используя ЛОЖЬ, для вывода значений.
Это называется условным оператором.
Аргумент getColumnName
оценивается, и если true, первый аргумент после ?
возвращается, если ложно, второе.
Итак, если getColumnName==true, вы увидите <td>NAME</td>
еще <td>Value</td>
Имеет смысл?
Это как следовать
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()
}
Поскольку getColumnName имеет тип bool, поэтому нет необходимости тестировать его, например
If (getColumnName == true)
Вы можете написать это как
If (getColumnName)
String.Format(строка, метод)
А метод String.Format заменяет элементы в указанной строке заданным объектом. Этот метод имеет два аргумента: первый — строка, а второй — объект.например
string.Format("Question number {0} is answered by {1} {2}", 11, "Adam", "Yesterday");
Выход будет
На вопрос номер 11 отвечает Адам Вчера.
Как вы можете видеть, {0} заменяется на 11, {1} заменяется на Адама, а {2} заменяется на Вчера.
вы можете прочитать об этом больше здесь
Это тернарный оператор, используется для специального формирования блока if else.