2015-03-16 16 views
12

Jestem nowy w programowaniu .NET. Przepraszam, jeśli wcześniej zadano to pytanie.F #: Różnica między Słownikiem, Hashtable i Mapą

Obecnie uczę się F #. Jakie są różnice między Dictionary, Hashtable i Map? Kiedy powinienem użyć każdego?

Mam również inne pytanie, które nie jest wymienione w tytule. Kiedy powinienem używać Async.RunSynchronicznie? Wydaje mi się to dość sprzeczne, więc jestem pewna, że ​​czegoś mi brakuje.

Odpowiedz

18

Wybór między Słownikiem, Hashtable i Mapą zależy od przypadków użycia. Powinieneś jednak znać cechy każdego z nich. Ta lista nie jest wyczerpująca, ale zaledwie kilka kluczowych różnic może chcesz zacząć od:

  • Hashtable Reprezentuje zbiór par klucz/wartość, które są organizowane w oparciu o kod hash klucza. Jest to zmienna kolekcja z .NET BCL
  • Słownik <> jest to ogólna implementacja tablicy hashtable. Również zmienna kolekcja z .NET BCL
  • Mapa To jest typ niezmienny F #. Jest on zaimplementowany w oparciu o drzewa AVL, które są całkowicie odmienną strukturą danych z różnymi charakterystykami wydajności i przypadkami użycia.

Jeśli wykonujesz wiele zapisów, zbiory tabel mieszania mają znacznie lepszą wydajność wypełniania niż drzewa AVL.

Pobieranie wartości ze Słownika za pomocą jej klucza jest bardzo szybkie, bliskie O (1), ponieważ klasa Dictionary jest zaimplementowana jako tablica asocjacyjna.

Mapy F # są zaimplementowane jako niezmienne drzewa AVL, wydajna struktura danych, która tworzy samobalansujące drzewo binarne. Drzewa AVL są dobrze znane ze swojej wydajności, w której mogą wyszukiwać, wstawiać i usuwać elementy w drzewie w czasie, gdy n jest liczbą elementów w drzewie.

Jeśli chodzi o mapę, wykorzystaj case, jeśli masz zestaw danych statycznych (takich jak dane konfiguracyjne, które są ładowane podczas uruchamiania aplikacji), musisz często wyszukiwać według klucza, mapa jest równie dobrym wyborem jak każdy, jego niezmienność w tym przypadku zapewnia, że ​​dane statyczne nie mogą być modyfikowane przez pomyłkę i mają niewielki wpływ na wydajność, ponieważ nigdy nie trzeba mutować po zainicjowaniu.

Async.RunSynchronously uruchamia dostarczone obliczenia asynchroniczne i czeka na wynik. Możesz go użyć w oknie interaktywnym F # na przykład do testowania asynchronicznych przepływów pracy.

+2

Jak Thomas wskazuje na to, że wybór odpowiedniego pojemnika asocjacyjnego zależy od przypadków użycia, ale ponieważ Mapy są niezmienne, można argumentować, że pasują one lepiej do stylu funkcjonalnego. – FuleSnabel

Powiązane problemy