How to get list of one column values from DataTable?

C#DatatableC# 2.0

C# Problem Overview


I have 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

I need list of "id" values.

Can I do it without loop over all rows in my DataTable and without Linq?

Edit:

After small discussion with Sergei I decided to use loop anyway.

C# Solutions


Solution 1 - C#

You can use Linq to DataTable:

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

UPDATE: Without Linq

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

Note for efficiency it's better to use row[index] instead of row[columnName]. First one just gets column by index from columns array. Latter gets column index from internal dictionary which maps names to indexes, and only then gets column by index.

Another thing to note is initializing list's capacity with rows count. If you will not do this, then internal array of list will be re-created and copied many times (depends on rows count).

And last thing to say - most efficient way with huge table (if possible) is filtering data on server side.

Solution 2 - C#

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

OR

int[] ids = dt.AsEnumerable().Select(r => r.Field<int>("id")).ToArray();

Solution 3 - C#

AsEnumerable() does not work for me so use:

List<string> ids = dt.Rows.Cast<DataRow>().Select(r => Convert.ToString(r["id"])).ToList();

For other data types use the appropriate Convert.XXX variant.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKamilView Question on Stackoverflow
Solution 1 - C#Sergey BerezovskiyView Answer on Stackoverflow
Solution 2 - C#user2343600View Answer on Stackoverflow
Solution 3 - C#charaView Answer on Stackoverflow