2015-12-11 4 views
7

ich die Liste der Objekte der folgenden Klasse habe,Flag alle aber ein Duplikat in einer Liste

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

Die Rechnungsnummern doppeln sein können, oder es kann sogar ein Fall von 4 Rechnungen, alle mit dem gleichen sein Nummer.

Ich muss das IsDupe-Flag auf alle außer einem der Rechnungsobjekt festlegen. Ein Ansatz ist die Brute-Force-Methode, eine Liste von Rechnungsnummern zu haben und diese mit Flags zu vergleichen. Ich habe auch versucht, diese question. Gibt es einen besseren syntaktischen Weg, es zu tun? TIA

Antwort

4

, dass Sie Unter der Annahme, Haben Sie eine Liste dieser Elemente, können Sie LINQ verwenden und ForEach Erweiterung verwenden:

List<Invoice> invoices = /* */; 

invoices 
    .GroupBy(inv => inv.InvoiceNumber) 
    .ForEach(group => group.Skip(1).ForEach(notFirst => notFirst.IsDupe = true)); 

Sie gruppiert Rechnungen um InvoiceNumber, und wenn eine Gruppe mehr als ein Element enthält, wird IsDupe auf true für alle außer für die erste festgelegt.

Allerdings scheint ForEach nicht LINQ-freundlich und weniger lesbar für mich zu sein.
Es sieht gut aus mit foreach:

foreach (var group in invoices.GroupBy(inv => inv.InvoiceNumber)) 
{ 
    foreach (var notFirstItem in group.Skip(1)) 
    { 
     notFirstItem.IsDupe = true; 
    } 
} 

Nun ist es absolut lesbar - jede Gruppe haben, nehmen alle Elemente mit Ausnahme der ersten und Marke als IsDupe = true.

5

Das funktioniert.

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

Produziert

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

Alternativ können Sie die Eigenschaft IsNotDupe nennen und profitieren Sie von der Tatsache, dass die boolean standardmäßig auf false (Sie die ersten ForEach entfernen)

Verwandte Themen