DistinctBy With Condition in LINQ

316 views Asked by At

I am having entity collection from Database which contains certain duplicates like One sequence with values and other sequence with empty values. I would like to remove sequence with empty one. I have tired moreLINQ for DistinctBy but still my case is not satisfying.

I have a following list from result set.

Result: Id=1, Name="Test1", Status="New", Values=NULL 
Result: Id=1, Name="Test1", Status="Assigned", Values=123 
Result: Id=2, Name="Test2", Status="New", Values=NULL 
Result: Id=2, Name="Test2", Status="Assigned", Values=698 
Result: Id=3, Name="Test3", Status="Assigned", Values=569 
Result: Id=4, Name="Test4", Status="New", Values=NULL 
Result: Id=5, Name="Test5", Status="Assigned", Values=156

I would like to retrieve follwoing outputs always by skipping duplicate with empty values or New status.

Result: Id=1, Name="Test1", Status="Assigned", Values=123 
Result: Id=2, Name="Test2", Status="Assigned", Values=698 
Result: Id=3, Name="Test3", Status="Assigned", Values=569 
Result: Id=4, Name="Test4", Status="New", Values=NULL 
Result: Id=5, Name="Test5", Status="Assigned", Values=156
2

There are 2 answers

0
Gert Arnold On

Group by Id and take the first record of each group that is ordered by Status:

var records = new[]
{
    (Id:1, Name:"Test1", Status:"New", Values:default(int?)),
    (Id:1, Name:"Test1", Status:"Assigned", Values:123),
    (Id:2, Name:"Test2", Status:"New", Values:default(int?)),
    (Id:2, Name:"Test2", Status:"Assigned", Values:698),
    (Id:3, Name:"Test3", Status:"Assigned", Values:569),
    (Id:4, Name:"Test4", Status:"New", Values:default(int?)),
    (Id:5, Name:"Test5", Status:"Assigned", Values:156),
};

var result = records
    .GroupBy(r => r.Id)
    .Select(r => r.OrderBy(x => x.Status).First());

Result:

Id  Name    Status      Values
------------------------------
1   Test1   Assigned    123
2   Test2   Assigned    698
3   Test3   Assigned    569
4   Test4   New         null
5   Test5   Assigned    156
4
Sowmyadhar Gourishetty On

You can so something like below

DOTNETFIDDLE working code

var modified = listOfValues
                .GroupBy(x => x.Id)
                .Select(x => x.OrderByDescending(x => x.Values ?? int.MinValue).FirstOrDefault());

Results:

enter image description here