2014-07-01 6 views
6

Przechodzę przez dużą listę obiektów, aby wykonać pewne czynności dotyczące tych obiektów na liście.Czy lista.count fizycznie iteruje listę, aby ją policzyć, czy też zachowuje wskaźnik

Podczas mojej iteracji usuniemy niektóre obiekty z listy w zależności od pewnych kryteriów.

Po zakończeniu wszystkich czynności muszę zaktualizować interfejs użytkownika pod kątem liczby obiektów na mojej liście. (Lista T).

PYTANIE:

Kiedy zadzwonić list.count, czy .net faktycznie iterację listy do count nim, czy też zapisać jako właściwość count/zmienna?

Jeśli .net fizycznie powtórnie przejdzie przez listę, równie dobrze mogę zachować licznik w mojej własnej iteracji poprzez listę i zapisać narzut?

Dzięki

+6

http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs – SLaks

Odpowiedz

7

List jest zaimplementowany jako listy tablicy, i śledzi jego własnej wielkości, więc powołując właściwość .Count nie wymaga żadnych iteracji.

Jeśli wywołujemy metodę rozszerzenia LINQ .Count(), to sprawdzić, czy pod spodem IEnumerable<> realizuje ICollection (którego List<> robi), i użyć właściwości .Count na tym interfejsie, jeśli to możliwe. Więc to też nie spowoduje żadnej iteracji.

Nawiasem mówiąc, są inne problemy, które napotkasz, jeśli spróbujesz usunąć elementy z listy podczas jej iteracji. Nie jest jasne, jak powinna zachowywać się iteracja podczas usuwania elementów spod iteratora, więc uniknie tego problemu przez zgłoszenie wyjątku, jeśli lista została zmodyfikowana od czasu utworzenia jej modułu wyliczającego.

+0

Każdy link, kod do tworzenia kopii zapasowych wyciągu? (Wiem, że to prawda) –

+0

@ L.B: Pracowałem nad tym, ale wygląda na to, że inne osoby dostarczyły te linki przed moim. – StriplingWarrior

+0

Rozumiem: * "Aby być pierwszym, opublikuj szybką odpowiedź zastępczą, a następnie ją popraw" * –

2

Możesz użyć dekompilatora, takiego jak swobodnie dostępny ILSpy, aby odpowiedzieć na te pytania. Jeśli masz na myśli typu List<T>, wówczas Count getter po prostu polega na przeczytaniu pole:

public int Count 
{ 
    get { return this._size; } 
} 
1

Oznaczyłeś swoje pytanie zarówno vb.net jak i C#, więc w odpowiedzi na "Jeśli.netto fizycznie re-iteracji listy, ja może równie dobrze trzymać licznik na moim iteracji poprzez listy i zapisać napowietrznej?”

Jeśli iteracja jest z For i = first To last następnie VB.NET i oceni firstlast, gdy wchodzi w pętlę:

Dim first As Integer = 1 
Dim last As Integer = 3 
For i = first To last 
    Console.Write(i.ToString() & " ") 
    last = -99 
Next 

wyjścia: 1 2 3

Jeśli do odpowiednika w języku C#, first i last oceniane są na każdej iteracji:

int first = 1; 
int last = 1; 
for (int i = first; i <= last; i++) 
{ 
    Console.Write(i.ToString() + " "); 
    last = -99; 
} 

wyjścia: 1

Jeśli Twój .Count() funkcja/nieruchomość jest drogie, aby ocenić i/lub nie chcesz to być ponownie ocenione na każdej iteracji (z jakiegoś innego powodu), a następnie w języku C# można przypisać go do zmiennej tymczasowej.