如果有任何重复项,请选择具有特定属性的第一个元素,否则选择第一个元素

Pio*_*r P 1 c# linq

例如,我有一个具有这些属性的对象列表

{ 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)

但我不知道接下来该做什么

Tim*_*ter 7

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".