例如,我有一个具有这些属性的对象列表
{ ID: "1", STATUS: "INA" }
{ ID: "1", STATUS: "ACT" }
{ ID: "2", STATUS: "INA" }
{ ID: "2", STATUS: "BLO" }
Run Code Online (Sandbox Code Playgroud)
现在我想通过ID对它们进行分组,以减少重复,但是当找到重复项时,我想检查是否有任何状态是ACT,如果是ACT我想选择此记录,但是如果没有ACT状态我想要选择第一次出现的副本.
在上面的例子中,我想选择
{ ID: "1", STATUS: "ACT" } //since it has ACT
{ ID: "2", STATUS: "INA" } //since it is first duplicate found
Run Code Online (Sandbox Code Playgroud)
我知道第一步就是
var NoDup = from l in list.AsEnumerable()
group l by l.ID into c
Run Code Online (Sandbox Code Playgroud)
但我不知道接下来该做什么
var q = list.GroupBy(x => x.ID)
.Select(g => g.OrderByDescending(x => x.STATUS == "ACT").First());
Run Code Online (Sandbox Code Playgroud)
因此,首先按ID分组,然后按bool比较返回的组对组进行排序x.STATUS == "ACT".真是"高"而不是假,这就是我使用的原因OrderByDescending.First确保我只获得每个重复组的第一条记录.由于OrderBy...具有稳定的排序,即使没有ACT状态,也保持原始订单.
另一种可能更有效的类似方法是:
var q = list.GroupBy(x => x.ID)
.Select(g => g.Where(x => x.STATUS == "ACT").DefaultIfEmpty(g.First()).First());
Run Code Online (Sandbox Code Playgroud)
如果duplicae-groups非常大,这可能会更有效,因为整个组不需要由bool第一组已经排序STATUS == "ACT".
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |