2009-09-30 5 views
34

Mam sytuację w kodzie, gdzie Dictionary<string, string> wydawało mi się najlepszym pomysłem - potrzebuję kolekcji tych obiektów i potrzebuję ich, aby były dostępne za pomocą unikalnego klucza. Dokładnie do czego służy koncepcja Dictionary, prawda?Słownik C# z dwiema wartościami na klucz?

Cóż, wymagania rozszerzyły się do tego stopnia, że ​​potrzebuję teraz posiadać dodatkową ilość informacji na każdy klucz (wartość boolowska, jeśli jesteś ciekawy).

Więc, myślę, rozwinąć koncepcję, aby utworzyć nową strukturę danych z ciągiem znaków i boolean i mieć teraz Dictionary<string, NewCustomObject>.

Jednak dla jednej dodatkowej wartości, takiej jak flaga boolean, po prostu wydaje się przesadą. A jednak nie znam żadnego podobnego do słownika obiektu generycznego z dwiema wartościami na klucz.

Czy po prostu słownika obiektów niestandardowych jest najlepszym sposobem, aby przejść o tym, czy jest coś prostszego w tym scenariuszu?

+14

Twój pierwszy pomysł na słownik wcale nie jest przesadą. Wyraża dokładną intencję, jest mocno napisany, z obsługą intellisense, z łatwością dostosuje się do następnej zmiany wymagań. –

+1

@Oren Trutner: Nie mogę się zgodzić. @Schnapple: nie przejmuj się parą, używaj niestandardowego obiektu o dobrze zdefiniowanych nazwach. Unikaj na przykład nazw wartości "Wartość1" i "Wartość2". Nadaj im znaczenie semantyczne. – Randolpho

+1

Nie ma nic, co podchodziłoby do "przesady" podczas tworzenia nowych zajęć w języku OO. Cóż, zwykle nie ma, aw tym przypadku nie ma. –

Odpowiedz

29

Właściwie to, co właśnie opisałeś, jest idealnym rozwiązaniem dla kolekcji Dictionary. Powinien zawierać pary klucz: wartość, niezależnie od typu wartości. Przez uczynienie wartości własną klasą, będziesz mógł ją łatwo rozszerzyć w przyszłości, jeśli zajdzie taka potrzeba.

+0

Kończyłem tę trasę, ponieważ inni wyglądali tak samo skomplikowanie i jest w .NET 3.5, więc nie krotki dla mnie –

+0

Mądra decyzja :) –

2

Czy to nie działa dla Ciebie?

Dictionary<string, List<string>> 

Albo można użyć Tuple i mieć słownika że:

Dictionary<string, Tuple<string, bool>> 
+0

W jaki sposób przechowuje w ten sposób wartość boolean? –

+0

Lub równoważnie, 'System.Collections.Specialized.NameValueCollection'. –

+1

Ralph: Odpowiedziałem początkowo na tytuł. Dodano rozwiązanie dla tego przypadku. –

3

Nie wierzę .net posiada wbudowany Multi-Map, w której jest generalnie struktura danych można użyć aby zrobić ten typ przechowywania. Z drugiej strony nie sądzę, żeby to było przesadą, używając tylko niestandardowego obiektu, który zawiera zarówno ciąg, jak i wartość logiczną.

+0

Multi-mapy umożliwiają przechowywanie wielu wartości dla danego klucza, ale wartości są tego samego typu i nie są w inny sposób rozróżniane, więc nie pasują do tej potrzeby. –

15

Słupek ze słownika Multivalue może zaspokoić Twoje potrzeby.

+8

Może warto, po prostu mieć kod Jona Skeeta w mojej aplikacji :) –

+0

Przykład Jona Skeeta idealnie spełni tę potrzebę i jest generyczny! –

7

Myślę, że ogólnie wpadasz w ideę krotek - coś w rodzaju Tuple<x, y, z> lub Tuple<string, bool, value>.

C# 4.0 będzie mieć dynamiczne wsparcie dla krotek, ale poza tym trzeba zrolować własne lub pobrać bibliotekę Tuple.

You can see my answer here gdzie umieszczam przykładowy kod dla ogólnej klasy krotki. Albo mogę po prostu odesłać go tutaj:

public class Tuple<T, T2, T3> 
{ 
    public Tuple(T first, T2 second, T3 third) 

    { 
     First = first; 
     Second = second; 
     Third = third; 
    } 

    public T First { get; set; } 
    public T2 Second { get; set; } 
    public T3 Third { get; set; } 

} 
4

W .NET4, można użyć (niezaznaczone): Dictionary<string, Tuple<bool,string>>

0

A Dictionary jest po prostu nadwozia zbiór obiektów. Jako taki, będzie przechowywać dowolny typ obiektu, który chcesz. Nawet najprostszy z obiektów, jak np. array (który pochodzi od Object), ale wymaga dużo mniej kodu w twoim imieniu.

Zamiast pisać całą klasę, ustaw dynamicznie przydzieloną tablicę lub listę w wartości i uruchom ją.

Słowniki są w ten sposób bardzo elastyczne.

0

Co z klasą Lookup?

Edit:

Po przeczytać pytanie dokładnie, że to nie jest najlepsze rozwiązanie, ale to wciąż dobry dla słownika z pewnymi wartościami za pomocą pojedynczego klawisza.

11
class MappedValue 
{ 
    public string SomeString { get; set; } 
    public bool SomeBool { get; set; } 
} 

Dictionary<string, MappedValue> myList = new Dictionary<string, MappedValue>; 
0

Inną ideą jest przechowywanie wartości logicznej w oddzielnej strukturze danych, np. a HashSet.

1

Korek zawsze jest dobrym rozwiązaniem. Ponadto w podejściu zorientowanym obiektowo zawsze preferuj kompozycję ponad dziedziczenie. Zbuduj obiekt złożony wykonując grupowanie. Po prostu. Wydaje mi się, że jesteś tutaj obeznany z pewnymi ładnymi i czystymi rozwiązaniami, od innych stackoverflow'erów. :)