在列表中标记除一个重复项之外的所有重复项

时间:2015-12-11 04:08:12

标签: c# list collections duplicates

我有以下类的对象列表,

class Invoice
{
   public int InvoiceNumber;
   public string CustomerName;
   public bool IsDupe;
}

发票号码可以是重复的,甚至可以是4张发票的案例,所有发票都有相同的号码。

我需要在除发票对象之外的所有对象上设置IsDupe标志。 一种方法是使用发票号码列表并将每个号码与标志进行比较的强力方法。 我也试过这个question。 有没有更好的语法方法呢? TIA

2 个答案:

答案 0 :(得分:5)

这很有效。

var invs = new List<Invoice> { new Invoice { InvoiceNumber = 1 }, 
                               new Invoice { InvoiceNumber = 1 }, 
                               new Invoice { InvoiceNumber = 1 },
                               new Invoice { InvoiceNumber = 2 }, 
                               new Invoice { InvoiceNumber = 3 }, 
                               new Invoice { InvoiceNumber = 3 } 
                             };

invs.ForEach(i => i.IsDupe = true);
invs.GroupBy (i => i.InvoiceNumber)
    .Select(g => g.First())
    .ToList()
    .ForEach(i => i.IsDupe = false);

可生产

1 null False 
1 null True 
1 null True 
2 null False 
3 null False 
3 null True 

或者,您可以调用属性IsNotDupe并利用布尔值默认为false的事实(您可以删除第一个ForEach

答案 1 :(得分:4)

假设您有这些元素的列表,您可以使用LINQ并使用$("#ifram_id").attr("src",document.referrer);扩展名:

ForEach

它按List<Invoice> invoices = /* */; invoices .GroupBy(inv => inv.InvoiceNumber) .ForEach(group => group.Skip(1).ForEach(notFirst => notFirst.IsDupe = true)); 向上对发票进行分组,如果一个论坛包含多个项目,则会将InvoiceNumber设置为IsDupe除了第一个以外的所有内容。

然而,使用true似乎不是LINQ友好的,对我来说不太可读 使用ForEach

看起来很棒
foreach

现在,它绝对可读 - 取每个组,除了第一个项目之外的所有项目,并标记为foreach (var group in invoices.GroupBy(inv => inv.InvoiceNumber)) { foreach (var notFirstItem in group.Skip(1)) { notFirstItem.IsDupe = true; } }