2010-06-17 15 views
21

w C# łapię się za pomocą List<T>, IList<T> lub IEnumerable<T> 99% czasu. Czy jest przypadek, w którym t byłoby lepiej użyć HashTable (lub w 2.0 i wyżej) ponad te?Kiedy używać hashtable

edit:

Jak wskazano, co ktoś chciałby zrobić z kolekcji często dyktuje, co powinno się używać, więc jeśli chcesz użyć Hashtable/Dictonary<T,T> nad List<T>?

Odpowiedz

16

Może nie bezpośrednio związane z pytaniem OPS, ale jest przydatny blogu o których zbiór struktura używać na: SortedSets

Zasadniczo, co chcesz zrobić z kolekcji określa, jakiego rodzaju kolekcji należy utworzyć .

Podsumowując bardziej szczegółowo:

  • Używaj IList jeśli chcesz być w stanie wyliczyć i/lub modyfikować Collection (zazwyczaj dodając na końcu listy)
  • Korzystanie IEnumeration jeśli tylko chcesz wyliczyć kolekcję (nie trzeba dodawać/usuwać - zazwyczaj używany jako typ zwracany)
  • Zastosowanie IDictionary jeśli chcesz uzyskać dostęp do elementów za pomocą klucza (dodawanie/usuwanie elementów szybko przy użyciu klucza)
  • Używaj SortedSet jeśli chcesz uzyskać dostęp do collecti we wstępnie zdefiniowanej kolejności (najczęściej jest to dostęp do kolekcji w kolejności)

  • Ogólnie rzecz biorąc, użyj słownika, jeśli chcesz uzyskać dostęp do/modyfikować elementy według klucza w żadnej określonej kolejności (preferowane w porównaniu do listy, jak to zwykle robi się w celu preferowane przez wyliczenie, jak nie można zmodyfikować wyliczanie, preferowany przez hashtable jako że nie jest ściśle wpisane, preferowane nad SortedList kiedy nie trzeba klucze posortowane)

+1

Aby dalej odróżnić Zbiory od innych Kolekcji: Zestaw nie pozwala na zduplikowanie elementów wewnątrz (a SortedSet itp. Nie wyrzuci wyjątku, aby ci o tym powiedzieć, ale funkcja .Add() zwróci wartość boolean, aby Ci o tym powiedzieć). Tak więc, chociaż w niektórych przypadkach możesz chcieć uporządkowanej listy, SortedSet może nie być idealną kolekcją do użycia. –

6

Tak, gdy trzeba (szybko) wyszukiwać przedmioty według klucza.

Oczywiście można szukać za pośrednictwem IList lub IEnumerable etc dla klucza pasującego jednak, że zajmie O (N) czasu zamiast O (1) dla Hashtable lub Dictionary.

0

Tak naprawdę nie porównujesz tych samych rzeczy, kiedy używam słownika, ponieważ chcę wyszukać dane, zazwyczaj chcę przechowywać listę obiektów i chcę móc szybko je wyświetlić używając jakiegoś klucza.

9

Używasz hashtable (słownika), gdy chcesz szybko wyszukać dostęp do elementu na podstawie klucza.

Jeśli używasz List, IList or IEnumerable ogólnie oznacza to, że zapętlasz dane (również w przypadku IEnumerable to zdecydowanie oznacza), a hashtable nie da ci niczego. Teraz, jeśli szukałeś wartości na jednej liście i używasz jej do uzyskania dostępu do danych na innej liście, byłoby to trochę inne. Na przykład:

  1. Znajdź pozycję na liście przedmiotu foo.
  2. Pozycja na liście dla foo odpowiada pozycji na innej liście zawierającej wartość Foo_Value.
  3. Uzyskaj dostęp do pozycji na liście sekund, aby uzyskać wartość Foo_Value.

Oto link opisujący różne typy danych.

Another link.

1

Hash Stoły są dobrym wyborem, jeśli często robi „coś w kolekcji” i nie są zaniepokojeni kolejności elementów w kolekcji.

Hasłami są indeksy. Możesz utrzymywać tablicę skrótów do indeksowania listy, więc możesz wybrać, czy chcesz uzyskać do niej dostęp w kolejności, czy losowo na podstawie klucza.

0

używam Hashtables dość często odesłać klucz/kolekcje wartości do JavaScript za pomocą metod strony.

Słowniki są dobre do buforowania rzeczy, gdy trzeba pobrać obiekt z danym identyfikatorem, ale nie chcą uderzać w bazę danych: Zakładając, że twoja kolekcja nie jest wystarczająco duża, aby wywołać dużą liczbę kolizji i potrzebnych danych pobieranie wystarczająco często, aby IEnumerable było zbyt wolne, Słowniki mogą zapewnić przyzwoitą przyśpieszenie.

0

Nie można dokładnie powiedzieć, nie wiedząc, co to kolekcja jest dla, ale jeśli elementy w kolekcji nie są unikatowe, nie można użyć tablicy hashtable, ponieważ nic nie będzie używane jako klucz. Więc być może zasada, której szukasz, polega na tym, że jeśli twoi członkowie są zupełnie inni i chcesz wyciągnąć poszczególne instancje za pomocą klucza, użyj tablicy hashtable. Jeśli masz kilka przedmiotów, które chcesz traktować w ten sam sposób (np. Robiąc foreach w całym zestawie), użyj listy.

0

Hashtable optymalizuje wyszukiwanie. Oblicza skrót każdego dodawanego klucza. Następnie używa tego kodu skrótu, aby bardzo szybko wyszukać element. Jest to starszy typ .NET Framework. Jest wolniejszy niż ogólny typ słownika.

+0

Czy masz odniesienia do spowolnienia Hashtable? –

Powiązane problemy