Как преобразовать все содержимое столбца DataTable в строку с разделителями в C #? - PullRequest
5 голосов
/ 22 апреля 2011

Я получаю данные с сервера MSSQL, используя SqlDataAdapter и DataSet.Из этого набора данных я создаю таблицу данных.Моя цель - преобразовать каждый столбец таблицы в строку, в которой элементы разделены запятыми.Я решил, что сначала попробую преобразование строк, прежде чем заставить работать разделитель.

Код выполняется в коде позади страницы ASP.Net.Конечная цель - передать строку в переменную jscript, это «функциональное требование», чтобы я создал строку с разделителями из столбцов и чтобы она заканчивалась как переменная jscript.

Вот что у меня естьпока что:

    DataSet myDataSet = new DataSet();
    mySqlDataAdapter.Fill(myDataSet);
    DataTable temperature = myDataSet.Tables["Table"];

    // LOOP1
    foreach (DataRow row in temperature.Rows)
    // this loop works fine and outputs all elements
    // of the table to the web page, this is just to
    // test things out
    {
        foreach (DataColumn col in temperature.Columns)
        {
            Response.Write(row[col] + " ### ");
        }
        Response.Write("<br>");
    }

    // LOOP2
    foreach (DataColumn column in temperature.Columns)
    // this loop was meant to take all elements for each
    // column and create a string, then output that string
    {
        Response.Write(column.ToString() + "<br>");
    }

В LOOP1 все работает нормально.Мои данные имеют 4 столбца, все соответственно отображаются с одной записью на строку на веб-странице.

Я видел код для LOOP2 на http://msdn.microsoft.com/en-us/library/system.data.datacolumn.tostring.aspx, который, кажется, делает именно то, что мне нужно, за исключением того, что он делаетна самом деле не делать то, что я хочу.

Единственное, что делает LOOP2 - это записывает 4 строки на веб-страницу.У каждой строки есть заголовок соответствующего столбца таблицы, но нет дополнительных данных.Ясно, что с моей стороны либо есть логический недостаток, либо я неправильно понимаю, как работает DataColumn и .toString для него.Пожалуйста, помогите мне в этом.Заранее спасибо.

РЕДАКТИРОВАТЬ: Вот пример результата запроса SQL, вот как выглядит таблица: Результат запроса таблицы @ ImageShack

Что я хочу получить в итогечетыре строки, вот пример для строки, которая будет создана из второго столбца: "-6.7, -7, -7.2, -7.3, -7.3".

Ответы [ 3 ]

9 голосов
/ 22 апреля 2011

Этот код объединит значения из ячеек в каждом столбце с ", ":

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 делает это для нас), производя результаты до того, как мы перейдем к следующей итерации - что бы мы ни захватили, используется немедленно.

0 голосов
/ 22 апреля 2011
0 голосов
/ 22 апреля 2011

Ссылка, которую вы разместили, четко гласит

Значение выражения, если свойство установлен; в противном случае имя столбца свойство.

и это то, что происходит. Вы получаете имена столбцов.

...