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

时间:2017-10-18 08:05:48

标签: c# linq

例如,我有一个对象列表,包含这些属性

{ 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

但我不知道下一步该做什么

4 个答案:

答案 0 :(得分:7)

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());

如果duplicae-groups非常大,这可能会更有效,因为如果第一组已经bool,则STATUS == "ACT"不需要整个组排序。Django template

答案 1 :(得分:2)

gsub("T"," ", df$published_at)
gsub("Z","", df$published_at)

答案 2 :(得分:2)

var NoDup = from l in list.AsEnumerable()
                  group l by l.ID into c
                  select c.FirstOrDefault(x => x.STATUS == "ACT") ?? 
                               c.FirstOrDefault()

答案 3 :(得分:0)

可以按照以下方式完成。

List
  .GroupBy( iLine =>
            iLine.ID )
  .Select( iGroup =>
           iGroup .FirstOrDefault( jLine => jLine.Status == "ACK" ? ) ?? iGroup.First() );