2015-12-11 18 views
7

ho l'elenco degli oggetti della classe seguente,Flag Tutti tranne uno duplicati in un elenco

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

I numeri di fattura possono essere duplicati o non ci può anche essere un caso di 4 fatture, tutti con lo stesso numero.

Devo impostare il flag IsDupe su tutti tranne uno dell'oggetto fattura. Un approccio è il metodo di forza bruta di avere un elenco di numeri di fattura e confrontare ciascuno di essi da contrassegnare. Ho anche provato questo question. Esiste un modo migliore per farlo in modo sintattico? TIA

risposta

4

Supponendo che si avere un elenco di questi elementi, è possibile utilizzare LINQ e utilizzare l'estensione ForEach:

List<Invoice> invoices = /* */; 

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

Raggruppa le fatture in su per InvoiceNumber e, se un gruppo contiene più di un articolo, imposta IsDupe su true per tutti tranne che per il primo.

Tuttavia, l'utilizzo di ForEach sembra non-LINQ-friendly e meno leggibile per me.
Sembra grande con foreach:

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

Ora, è assolutamente leggibile - prendere ogni gruppo, prendere tutte le voci tranne che per il primo, e segnare come IsDupe = true.

5

Questo funziona.

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

Produce

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

In alternativa, si potrebbe chiamare la proprietà IsNotDupe e approfittare del fatto che le impostazioni predefinite booleani per falsa (è possibile rimuovere il primo ForEach)

Problemi correlati