Distinct in Linq based on only one field of the table
I am trying to use .distinct in Linq to get result based on one field of the table (so do not require a whole duplicated records from table).
I know writing basic query using distinct as followed:
var query = (from r in table1
orderby r.Text
select r).distinct();
but I need results where r.text
is not duplicated.
Solution 1:
Try this:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
This will group the table by Text
and use the first row from each groups resulting in rows where Text
is distinct.
Solution 2:
MoreLinq has a DistinctBy method that you can use:
It will allow you to do:
var results = table1.DistictBy(row => row.Text);
The implementation of the method (short of argument validation) is as follows:
private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
Solution 3:
but I need results where r.text is not duplicated
Sounds as if you want this:
table1.GroupBy(x => x.Text)
.Where(g => g.Count() == 1)
.Select(g => g.First());
This will select rows where the Text
is unique.