Вопрос

У меня есть этот фрагмент кода на С#:

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top