Этот код объединит значения из ячеек в каждом столбце с ", "
:
foreach (var column in temperature.Columns)
{
DataColumn dc = column as DataColumn;
string s = string.Join(", ", temperature.Rows.OfType<DataRow>()
.Select(r => r[dc]));
// do whatever you need with s now
}
Например, для DataTable, определенного как:
DataTable table = new DataTable();
table.Columns.Add(new DataColumn("Column #1"));
table.Columns.Add(new DataColumn("Column #2"));
table.Rows.Add(1, 2);
table.Rows.Add(11, 22);
table.Rows.Add(111, 222);
... он выдаст "1, 11, 111"
и "2, 22, 222"
строк.
Редактировать: Я видел, что вы решили объявить столбец как var, а не DataColumn, это вопрос личных предпочтений / стиля или есть проблема с кодированием?
Рассмотрим следующий сценарий (на том же примере таблицы данных, что и выше):
// we decide we'll use results later, storing them temporarily here
List<IEnumerable<string>> columnsValues = new List<IEnumerable<string>>();
foreach (DataColumn column in temperature.Columns)
{
var values = temperature.Rows.OfType<DataRow>()
.Select(r => r[column].ToString())
columnsValues.Add(values);
}
Мы предположим, мы получили список значений столбцов. Итак, когда мы печатаем их, вот так:
foreach (var lisOfValues in columnsValues)
{
foreach (var value in listOfValues)
{
Debug.Write(value + " ");
}
Debug.WriteLine("");
}
Мы ожидаем увидеть 1 11 111
, а затем 2 22 222
. Правильно?
Неправильный .
Этот код выведет 2 22 222
дважды. Зачем? Наша .Select(r => r[column].ToString())
захватывает переменную column
- не ее значение, а саму переменную - и, поскольку мы не используем ее сразу, как только мы выходим из цикла, все, что мы знаем последний значение column
.
Чтобы узнать больше об этой концепции, найдите замыкания и захваченные переменные - например, в сообщениях типа this .
Резюме
В этом случае вы можете использовать оператор DataColumn
в foreach
. Здесь это не имеет значения, потому что мы перечисляем наш .Select(r => r[dc])
в любом случае внутри цикла (точнее, string.Join
делает это для нас), производя результаты до того, как мы перейдем к следующей итерации - что бы мы ни захватили, используется немедленно.