2010-10-05 10 views
6

Zapraszam do skorygowania mojej terminologii i zrozumienie listy w razie potrzeby ..Jeśli usuniesz() konkretny element z listy <T>, to spowoduje to również usunięcie "pustego gniazda"?

Jeśli mam listę pięciu elementów, gdzie każdy element ma unikatowy identyfikator ...

[item 1] 
[item 2] 
[item 3] 
[item 4] 
[item 5] 

i usunąć pozycja z ID 72 (na przykład), a zdarza się 3. miejsce w liście ...

to skończyć jak ten ...

[item 1] 
[item 2] 
[null] 
[item 4] 
[item 5] 

lub jak to

[item 1] 
[item 2] 
[item 3] 
[item 4] 

gdzie co kiedyś pozycja 4 jest teraz pozycja 3, itd

proszę wyjaśnić, jeśli możesz :)

Odpowiedz

3

W przykładzie

[item 1] 
[item 2] 
[item 3] 
[item 4] 
[item 5] 

jeśli usuniesz [pozycja 3], lista-klasa po prostu skopiować część tablicy „za” tego elementu do indeksu pozycji, wewnętrzna tablica liście będzie wyglądać następująco:

[item 1] 
[item 2] 
[item 4] 
[item 5] 
[default(item)] 

nie można uzyskać dostępu do teraz ostatnią pozycję jednak, ponieważ Lista przechowuje zmiennej wielkości śledzić liczbę przedmiotów, do których można uzyskać dostęp. Praktycznie więc lista wygląda jak drugi przykład z zewnątrz, ale wewnętrzna tablica może być większa.

Edit: Należy również pamiętać, że w reallity tablica jest znacznie większy niż, że od listy <> spowoduje zmianę rozmiaru go podczas wkładania przedmiotów (będzie podwoić wielkość tablicy, gdy nie znajduje się wystarczająco dużo miejsca dla nowego produktu) .Na przykład, jeśli dodać 5 pozycji na liście, a następnie lista będzie już wyglądać tak:

[item 1] 
[item 2] 
[item 3] 
[item 4] 
[item 5] 
[default(item)] 
[default(item)] 
[default(item)] 
+0

Doskonałe, więc znowu, niezależnie od tego, co powinno mnie obchodzić, jestem ciekawy, czy to oznacza, że ​​moja lista może nigdy naprawdę się nie zmniejszyć, tylko rosnąć, tak jakbym usunęła rzeczy, które pozostają w tym samym rozmiarze głęboko, prawda? – BigOmega

+1

Rozmiar nie zmniejszy się, chyba że wywołasz 'TrimExcess()' lub ustaw właściwość 'Capacity'. Implementacja 'List ' przycina tablicę w dowolnym momencie, chyba że wyraźnie zażądasz. –

14

druga opcja. Zachowuje się jak List, a nie jako tablica.

Możliwe jest usunięcie elementu z określonego indeksu. Indeksy poprzednich elementów przy tych i wyższych indeksach są zmniejszone o 1.

+1

Jest to także przydatne, aby pamiętać, że z powodu tego zachowania, modyfikacja zawartości listę może nie zostać wykonane w foreach iteracja, ponieważ warunki foreach nie mogą być zmieniane. –

+1

Podczas korzystania z Listy "puste miejsce" NIE zostanie usunięte. Elementy są przesunięte przez Array.Copy, a teraz niepoprawny ostatni "pusty slot" jest wypełniony domyślnie (T). – sloth

+0

@dkson i nowy "pusty slot" znajdą się na samym końcu listy? – BigOmega

1

Moje stwierdzenie zostało poprawione przy pomocy obserwacji technicznych, ale dla celów przeliczalnych obiekt listy, po usunięciu przedmiotu zniknął, np. drugi przykład.

MSDN

6

Właściwie z realizacją System.Collections.Generic.List<T>, podstawowa tablica, która służy do przechowywania przedmiotów skończy się tak:

[item 1] 
[item 2] 
[item 4] 
[item 5] 
[null] 

Oznacza to, że bez zmiany rozmiaru tablicy, trzecia pozycja została usunięta, a 4. i 5. pozycja zostały przesunięte.

Oczywiście po wyliczeniu kolekcji pominięto końcowe wartości zerowe, ponieważ wielkość kolekcji jest wykorzystywana do określenia miejsca zatrzymania. (Edit: i próbuje indeksów dostępu poza logicznego końca kolekcji zawiedzie.)

+6

To nie jest w 100% poprawne. Jeśli T jest typem wartości, to ostatni element w tablicy Listy nie ma wartości NULL, ale domyślna wartość tego typu wartości. – sloth

Powiązane problemy