2011-07-15 18 views
5

Używam słownika C#.Słownik C# z wieloma wartościami na klucz

Dictionary<int, string> d = new Dictionary<int, string>(); 

używam słownika jak to mogę mieć wartość klucza być unikalna i jest egzekwowane przez Dictionary.

Kluczową wartością będzie int. Zanim miałem potrzebę tylko jednej wartości. Teraz sytuacja rozszerzyła się tam, gdzie muszę przechowywać wiele wartości (z różnymi typami danych) dla tego samego klucza.

Coś takiego - (chociaż to nie będzie działać):

Dictionary<int,string,string,bool, bool,int,bool> d = new Dictionary<int, string,string,bool, bool,int,bool>(); 

Zauważmy, że ciąg, string, bool, bool, int, bool są dodatkowe wartości lubię przechowywać na polu klucza, który będzie int.

Nie jestem pewien, w jaki sposób chciałbym to zrobić. Jak uzyskać kluczową wartość do przechowywania wielu wartości z różnymi typami danych. Na drodze, którą widzę, że to możliwe, należy zapisać dodatkowe pola w Liście, ale nie wiem, jak to się wszystko potoczy. Jeśli ktoś może dostarczyć i przykład, który byłby doceniony.

Z góry dziękuję.

Odpowiedz

11

Jako typ można użyć wartości Tuple.

var d = new Dictionary<int,Tuple<string,string,bool, bool,int,bool>>(); 

Alternatywnie utworzyć typ (klasa lub struct), która posiada różne rodzaje jako grupa - są szanse, że będzie to lepszy sposób modelować rzeczy.

+0

+1 po prostu dlatego, że jest sexy i nigdy wcześniej tego nie widziałem. –

+8

Ostrzegałbym przed użyciem krotki, ponieważ podczas gdy masz silne pisanie, nie masz żadnego kontekstu co oznaczają wartości *. W tym przypadku chciałbym podnieść sugestię klasy enkapsulacyjnej z bycia zastępcą do bycia główną odpowiedzią , jak zrobił @spender. –

+0

Zgadzam się z @AnthonyPegram, proszę nie używać Tuple. Krotki IMO to tylko lenistwo ze strony programisty. Klasy są bezpieczne dla typów i kontekstowe. – Neil

15

Utwórz niestandardowy typ danych z polami, które są string, string, bool, bool, int, bool i użyj tego jako wartości słownika.

class MyType 
{ 
    public string SomeVal1{ get; set; } 
    public string SomeVal2{ get; set; } 
    public bool SomeVal3{ get; set; } 
    public bool SomeVal4{ get; set; } 
    public int SomeVal5{ get; set; } 
    public bool SomeVal6{ get; set; } 
} 

następnie

var someDictionary = new Dictionary<int, MyType>(); 

i

someDictionary.Add(1, 
        new MyType{ 
         SomeVal1 = "foo", 
         SomeVal2 = "bar", 
         SomeVal3 = true, 
         SomeVal4 = false, 
         SomeVal5 = 42, 
         SomeVal6 = true 
        }); 
0

Jedynym myśleć wszystkim co maniaków tutaj powiedział, mogę dodać, myślę, że powinniśmy się osłaniającego że słownika do jakiejś klasy, więc użytkownik tego opakowania słownika nigdy nie zrozumie, co dzieje się pod okapami, i implementuje wewnątrz tej klasy preferowana logika odzyskiwania lub jedna z wymienionych tutaj.

+0

Sugerowałbym strukturę nad klasą, ponieważ nie zawiera ona żadnych metod, a zatem lepiej jest użyć typu wartości niż typ odniesienia, który znajduje się na stercie i wymaga wysiłku związanego ze zbieraniem pamięci w celu zwolnienia pamięci, po jej usunięciu. z. Z pewnością nie użyłbym krotki. W rzeczywistości, myślę, że używanie krotki jest tak samo złą praktyką jak używanie var dla nazwanych typów. –

0

Słowniki są parami key/value. Gdzie jeden klucz odpowiada jednej wartości. Wartością może być dowolny obiekt, ponieważ można go w prosty sposób utworzyć obiekt zawierający wszystkie wymagane elementy. Rozważmy następujące:

var d = new Dictionary<int, string, string, bool, bool, int, bool>(); 

Konsument tego słownika nie będzie miał pojęcia, co te pierwotne typy danych mają reprezentować. Powinieneś utworzyć obiekt:

public class Person : IPerson 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public bool IsMarried { get; set; } 
    public bool HasChildren { get; set; }   
    public bool IsHappy { get; set; } 

    public Person(int id) 
    { 
     Id = id; 
    } 
} 

Oczywiście obiekt ten jest w całości wykonany w celu dopasowania typów i reprezentacji danych w pojemniku.W tym rozumieniu możesz wykonać następujące czynności:

var d = new Dictionary<int, IPerson>(); 
Powiązane problemy