How do I get a distinct, ordered list of names from a DataTable using LINQ?
Question
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?
Solution
To make it more readable and maintainable, you can also split it up into multiple LINQ statements.
- First, select your data into a new list, let's call it
x1
, do a projection if desired - Next, create a distinct list, from
x1
intox2
, using whatever distinction you require - Finally, create an ordered list, from
x2
intox3
, sorting by whatever you desire
OTHER TIPS
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 );
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Try out the following:
dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Try the following
var names = (from dr in dataTable.Rows
select (string)dr["Name"]).Distinct().OrderBy(name => name);
this should work for what you need.
To abstract: all of the answers have something in common.
OrderBy needs to be the final operation.
You can use something like that:
dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow