Graeme Cooper Ответов: 3

Можно ли выбрать все данные в datatable и сохранить их в массиве?


Вообще говоря, я создал код, который обращается к нескольким серверам и считывает данные с этих серверов.
В настоящее время я извлек все данные в виде строка из таблиц данных и отображать их с помощью ListView, однако мне было интересно, есть ли способ сохранить данные в массиве, чтобы я мог выполнять основные математические операции позже.

Что я уже пробовал:

for (int i = 0; i < DataTable1.Rows.Count; i++)
{
    var resultTest = DataTable1.AsEnumerable().Select(r => r.Field<string>("Name")).ToArray();
    listView1.Items.Add(resultTest[i].ToString());
}

Graeme Cooper

Просто чтобы вы знали, что я знаю, что приведенный выше код отображает один столбец, а не весь набор данных. Мне просто трудно придумать возможное решение.

Graeme Cooper

Мне очень жаль, что мой пользователь follow codeproject, я очень нетерпеливый человек в эти дни. Я решил свою собственную проблему через 5 минут после публикации этого вопроса.

3 Ответов

Рейтинг:
6

Graeme Cooper

for (int i = 0; i < DataTable1.Rows.Count; i++)
{
    var resultTest1 = DataTable1.AsEnumerable().Select(r => r.Field<string>("column Name")).ToArray();
    var resultTest2 = DataTable1.AsEnumerable().Select(r => r.Field<string>("Column Name")).ToArray();
    var resultTest3 = DataTable1.AsEnumerable().Select(r => r.Field<string>("Column Name")).ToArray();
    var resultTest4 = DataTable1.AsEnumerable().Select(r => r.Field<string>("Column Name")).ToArray();
    listView1.Items.Add(resultTest1[i].ToString() + " " + resultTest2[i].ToString() + " " + resultTest3[i].ToString() + " " + resultTest4[i].ToString());
}


Примечание:
var resultTest2 = DataTable1.AsEnumerable().Select(r => r.Field<int?>("Column Name")).ToArray();
чтение целочисленных значений столбцов


Richard Deeming

Вы создаете массив, содержащий каждое значение столбца для каждой строки, просто чтобы извлечь значение для одной строки. Это ужасно неэффективно!

Попробуй:

for (int i = 0; i < DataTable1.Rows.Count; i++)
{
    var row = DataTable1.Rows[i];
    object value1 = row["Column1"];
    object value2 = row["Column2"];
    object value3 = row["Column3"];
    object value4 = row["Column4"];
    listView1.Items.Add(string.Format("{0} {1} {2} {3}", value1, value2, value3, value4));
}

Graeme Cooper

Да, Спасибо, что это тоже работает, но я не вижу, как я могу использовать значения столбцов позже, используя этот метод. Я попытался сделать что-то навязчиво похожее, где value1-4 было просто значением[0-4] (вообще говоря, он помещал каждый элемент из datatable в расположение массива)(это была не очень хорошая идея).

Рейтинг:
26

OriginalGriff

Хм.
resultTest-это массив: вы получите точно такие же результаты, если сделаете это:

string[] resultTest = DataTable1.AsEnumerable().Select(r => r.Field<string>("Name")).ToArray();
Так почему же это создает вам проблемы?

Но, пожалуйста, начните с просмотра вашего кода: почему вы перебираете все строки и преобразуете всю DataTable каждый раз, когда вы обходите цикл, только для того, чтобы использовать одну строку, а остальные выбрасываете?
Вы могли бы просто сказать это:
for (int i = 0; i < DataTable1.Rows.Count; i++)
{
    listView1.Items.Add(DataTable1.Rows[i]["Name"].ToString());
}
и получить те же результаты.

Если вам нужен массив числовых значений, то вы можете просто отбросить цикл, изменить единственную строку Linq, которая у вас есть, и попытаться разобрать или разобрать столбец на число - но столбцы, называемые "именем", обычно не содержат числовых данных!


Graeme Cooper

Относительно новичок в c# и linq, поэтому я действительно не знаю входов и выходов. Эм...Что касается: for (int i = 0; i < DataTable1.Rows.Граф; i++)
{
мыши listview1.Предметы.Добавить(Объект Datatable1.Строки[Я]["имя"].Метод toString());
}
Да, это был результат одной из моих попыток, однако, когда дело дошло до отображения его с помощью listview, его внешний вид не был благоприятным.(хотел, чтобы структура была как можно ближе к исходной таблице sql)

Кроме того, да, с этого момента я действительно буду лучше анализировать свой код . И спасибо за помощь.

OriginalGriff

Всегда пожалуйста!
Я бы сделал это так: создал класс со свойствами для каждого из соответствующих столбцов в вашем DT и добавил конструктор, принимающий DataRow. Затем конструктор преобразует данные столбцов по мере необходимости в свойства, и вы можете создать массив (или лучше список) экземпляров класса. Гораздо более гибкий, более легкий для чтения код, и правильные типы данных готовы использовать, когда они вам понадобятся.

Рейтинг:
12

#realJSOP

Вместо того чтобы возиться с попытками сократить его, переместите данные в List объектов. В этот момент им будет легче манипулировать. Вы тратите так много времени, пытаясь использовать данные непосредственно из компьютера. DataTable что ты теряешь свой путь.

public class ItemList : List<MyItem>
{
    public ItemList(DataTable dt)
    {
        foreach(DataRow row in dt.Rows)
        {
            this.Add(new MyItem(row));
        }
    }
}

public class MyItem
{
    // properties for each row column go here

    public MyItem(DataRow row)
    {
        // populate the properties from the row
    }
}

// usage

ItemList myItems = new ItemList(DataTable1);


Если вы хотите получить немного больше фантазии, вы можете получить данные (из базы данных, я предполагаю) в конструкторе списка, что еще больше упростит внешний код.