例如,我有一个对象列表,包含这些属性
{ 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
但我不知道下一步该做什么
答案 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() );