2011-06-20 7 views
6

Mam listę, która może zawierać wiele wystąpień tego samego obiektu. Teraz muszę policzyć, jak często dany obiekt znajduje się na tej liście.Numer licznika danego obiektu na liście z LINQ

int count = 0; 
foreach (IMyObject item in myList) 
    if (item == object2Count) 
    count++; 

Jestem pewien, że można to zrobić lepiej dzięki LINQ, ale LINQ wciąż jest dla mnie tajemnicą.

Moje pierwsze pytanie brzmi: jak policzyć obiekty przez LINQ i drugie pytanie: czy ta wersja LINQ będzie wolniejsza czy szybsza? Używam ObservableCollection oraz liczbę pozycji na liście jest usally raczej mały ... usally nie więcej niż 20.

góry dzięki,
Frank

Odpowiedz

10

Można łatwo policzyć obiekty w kolekcji za pomocą metoda rozszerzenia Count. Albo:

var count = myList.Where(item => item == object2Count).Count(); 

lub

var count = myList.Count(item => item == object2Count); 

W odniesieniu do wyników powinna być taka sama, jak w pętli foreach.

(. Twój orzecznik item == object2Count wygląda nieco dziwnie, ale to nie jest związane z pytaniem o sposób liczenia obiektów w kolekcji)

+0

Dzięki za odpowiedź. Teraz, gdy widzę odpowiedź, wydaje się to oczywiste w ten sposób: D. Co do mojego orzeczenia, co jest dziwnego w tym przypadku i jak zaproponowałbyś napisanie go w inny sposób? – Aaginor

+0

@Aaginor: Jeśli '==' używa równości odniesienia i nie przechowujesz tej samej instancji więcej niż jeden raz w zbiorze 'count' będzie 0 lub 1. Więc w zasadzie decydujesz, czy' object2Count' należy do kolekcji . Istnieją bardziej wydajne sposoby określania tego za pomocą metody rozszerzania "Any". Jeśli z drugiej strony przesłoniłeś operatora '==', twój predykat jest w porządku. –

+0

Nie tworzę duplikatu obiektu, który ma być przechowywany, ale wielokrotnie przechowuję ten sam odnośnik. (Tak jak IMyObject o = new MyObject(); myList.Add (o); myList.Add (o);) (A przynajmniej uważam, że przechowuję ten sam obiekt: D) ​​ – Aaginor

0

Spróbuj tego:

var count = objectlist.Count(x => x == object2Count)); 
+1

-1 - to zapytanie nie zwraca liczby wystąpień obiektu "object2Count", ale liczba obiektów klasy "ObjectClass" –

+0

To jest złe, nie szuka wszystkich obiektów określonej klasy, ale dla określonego obiektu – Vedran

1
int count = myList.Count(x => x == object2Count); 
Powiązane problemy