2015-12-11 20 views
7

Mam listę obiektów poniższej klasie,Flag wszystkie ale jeden duplikaty na liście

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

Numery na fakturze mogą być duplikat lub nie może być nawet przypadek 4 faktur, wszystkie z tym samym numer.

Muszę ustawić flagę IsDupe na wszystkich oprócz jednego z obiektów faktury. Jednym podejściem jest metoda brute force polegająca na posiadaniu listy numerów faktur i porównywaniu każdego z nich z flagą. Próbowałem również tego question. Czy istnieje lepszy sposób syntaktyczny to zrobić? TIA

Odpowiedz

4

Zakładając, że Miej listę tych elementów, możesz użyć LINQ i wykorzystać rozszerzenie ForEach:

List<Invoice> invoices = /* */; 

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

Grupuje faktury w górę o InvoiceNumber, a jeśli grupa zawiera więcej niż jeden przedmiot, ustawia IsDupe na true dla wszystkich z wyjątkiem pierwszego.

Wydaje się jednak, że używanie ForEach nie jest przyjazne dla LINQ i jest dla mnie mniej czytelne.
Wygląda świetnie z foreach:

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

Teraz jest absolutnie czytelny - wykorzystać każdą grupę, wziąć wszystkie elementy z wyjątkiem pierwszego, jak i znak IsDupe = true.

5

To działa.

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

Produkuje

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

Alternatywnie, można nazwać właściwość IsNotDupe i skorzystać z faktu, że wartość logiczna domyślnie false (można usunąć pierwszą ForEach)

Powiązane problemy