2014-05-19 8 views
19

У меня есть DataTable.Как получить список значений столбца из DataTable?

DataTable dt = new DataTable(); 

dt.Columns.Add(new DataColumn("id", Type.GetType("System.Int32"))); 
dt.Columns.Add(new DataColumn("name", Type.GetType("System.String"))); 
// more columns here 

Мне нужен список значений «id».

Могу ли я сделать это без петли по всем строкам в мой DataTable и без Linq?

Edit:

После небольшой дискуссии с Сергеем я решил использовать цикл в любом случае.

ответ

41

Вы можете использовать Linq для DataTable:

var ids = dt.AsEnumerable().Select(r => r.Field<int>("id")).ToList(); 

UPDATE: Без Linq

List<int> ids = new List<int>(dt.Rows.Count); 
foreach(DataRow row in dt.Rows) 
    ids.Add((int)row["id"]); 

Примечание для эффективности лучше использовать row[index] вместо row[columnName]. Сначала он получает столбец по индексу из массива столбцов. Latter получает индекс столбца из внутреннего словаря, который сопоставляет имена индексам и только затем получает столбец по индексу.

Еще одно примечание - инициализация емкости списка с количеством строк. Если вы этого не сделаете, то внутренний массив списка будет повторно создан и скопирован многократно (зависит от количества строк).

И последнее, что нужно сказать - самый эффективный способ с огромной таблицей (если это возможно) является фильтрация данных на стороне сервера.

+1

@TimSchmelter методы расширения с C# 2? :) –

+0

Первый с Linq, второй с петлей. Этого я хочу избежать. – Kamil

+0

@ Kamil Я уверен, что не было никакого ограничения цикла изначально. Можете ли вы объяснить, что не так с петлями? –

Смежные вопросы