简体   繁体   English

LINQ 中的 DistinctBy 条件

[英]DistinctBy With Condition in LINQ

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.我已经厌倦了DistinctBy moreLINQ ,但我的情况仍然不令人满意。

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.我想始终通过跳过具有空值或New状态的重复项来检索以下输出。

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

You can so something like below你可以像下面这样

DOTNETFIDDLE working code DOTNETFIDDLE工作代码

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

Results:结果:

在此处输入图片说明

Group by Id and take the first record of each group that is ordered by Status :Id分组并获取按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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM