例如,我有一个具有这些属性的对象列表
{ ID: "1", STATUS: "INA" }
{ ID: "1", STATUS: "ACT" }
{ ID: "2", STATUS: "INA" }
{ ID: "2", STATUS: "BLO" }
现在我想按 ID 将它们分组,以减少重复项,但是当发现重复项时,我想检查是否有任何状态是 ACT,如果是 ACT,我想选择此记录,但如果没有 ACT 状态,我想要选择第一次出现的重复项。
在上面的例子中,我想选择
{ ID: "1", STATUS: "ACT" } //since it has ACT
{ ID: "2", STATUS: "INA" } //since it is first duplicate found
我知道第一步是
var NoDup = from l in list.AsEnumerable()
group l by l.ID into c
但我不知道接下来要做什么
var q = list.GroupBy(x => x.ID)
.Select(g => g.OrderByDescending(x => x.STATUS == "ACT").First());
因此,首先按 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());
如果重复组非常大,这可能会更有效,因为bool
如果第一个已经是 ,则不需要按整个组进行排序STATUS == "ACT"
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句