Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get a distinct, ordered list of names from a DataTable using LINQ?

Tags:

c#

linq

.net-3.5

I have a DataTable with a Name column. I want to generate a collection of the unique names ordered alphabetically. The following query ignores the order by clause.

var names =     (from DataRow dr in dataTable.Rows     orderby (string)dr["Name"]     select (string)dr["Name"]).Distinct(); 

Why does the orderby not get enforced?

like image 203
Bob Avatar asked Aug 01 '08 13:08

Bob


People also ask

How do I select distinct rows in DataTable?

Where: first parameter in ToTable() is a boolean which indicates whether you want distinct rows or not. second parameter in the ToTable() is the column name based on which we have to select distinct rows. Only these columns will be in the returned datatable.

Can LINQ be used on DataTable?

A DataTable can be queried with LINQ, just as any other IEnumerable<T> list. Note: DataTable does not implement IEnumerable<T>. You have to call AsEnumerable, which is an extension method for DataTable, to obtain a wrapper that implements that interface.

How do I get distinct from a list?

To get unique elements. List<int> myList = list. Distinct(). ToList();


2 Answers

The problem is that the Distinct operator does not grant that it will maintain the original order of values.

So your query will need to work like this

var names = (from DataRow dr in dataTable.Rows              select (string)dr["Name"]).Distinct().OrderBy( name => name ); 
like image 117
Bob Avatar answered Oct 11 '22 22:10

Bob


To make it more readable and maintainable, you can also split it up into multiple LINQ statements.

  1. First, select your data into a new list, let's call it x1, do a projection if desired
  2. Next, create a distinct list, from x1 into x2, using whatever distinction you require
  3. Finally, create an ordered list, from x2 into x3, sorting by whatever you desire
like image 40
a7drew Avatar answered Oct 11 '22 22:10

a7drew