2012-07-10 6 views
14

Powiel możliwe:
Duplicate keys in .NET dictionaries?Czy istnieje słownik <Key,Value> bez unikalnego klucza?

muszę stworzyć Collection<string,object>, jeden ciąg, a drugi jest obiektem. Nie mogę używać Słownika, ponieważ żaden z elementów nie jest unikalny.

Czy istnieje sposób na utworzenie List<T,T>? Ponieważ nie chcę tworzyć obiektu do przechowywania obu wartości tylko po to, aby użyć go w jednej pętli foreach.

Dzięki

+0

czy enum pasowałoby do twoich potrzeb? nie jestem pewien, czy chcesz to osiągnąć. – Freeman

+3

dlaczego nie można utworzyć łańcucha 'Dictionary <, lista >'? –

+1

Lista KeyValuePair? http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx – dash

Odpowiedz

19

Spróbuj List<Tuple<string, object>>. Następnie możesz uzyskać standardową obsługę linq na liście, aby uzyskać dostęp do każdego Tuple<string, object>.

Urządzenie Tuple<,> class jest dostępne od wersji .NET 4, ale można łatwo naśladować typ krotki bez zbytniego wysiłku.

Myślę, że krotki są uważane za równe w oparciu o ich wartości pozycji, ale z object prawdopodobnie będzie to odniesienie równe, a zatem nie powinno być równe ... jeśli to ma jakiś sens!

Więcej informacji na temat równości tutaj:

Surprising Tuple (in)equality

Aktualizacja:

Jeśli trzeba skojarzyć listę elementów z kluczem do celów odnośnika, duplikat pytanie odpowiedź poprawnie podświetla klasę Lookup (w twoim przypadku, Lookup<string, object>), która wyrażałaby twoje intencje nieco jaśniej niż List<Tuple<string, object>>.

+1

Ograniczeniem jest to, że Tuple nie jest dostępny w starszych wersjach .Net - został wprowadzony w .Net 4 – dash

+0

@dash Prawda, ale krotek może być zaimplementowany ogólnie w starszych wersjach, wiele osób miało Tuple zanim zostało upieczone. Albo sposób pytania jest oznaczony agnostycznie, więc zastrzegam sobie prawo do założenia najnowszego :-) dzięki za wyjaśnienie. –

+1

Komentarz jest dla innych osób, które widzą twoją odpowiedź - PowerCollections ma ją na zawsze :-) – dash

4

spróbować stworzyć swoją klasę niestandardową i używać go

class KeyValue<Tkey,TValue> 
    { 
     public Tkey Key {get;set;} 
     public TValue Value {get;set;} 
    } 

wykorzystanie takich jak

List<KeyValue<string,string>> list = new List<KeyValue<string,string>>(); 
+0

Dzięki, napisałem, że chcę uniknąć tworzenia nowego typu obiektu. – eugeneK

6

można użyć

List<KeyValuePair<string,object>> 

lub

Dictionary<string,List<object>> 
3

Może możesz utworzyć listę krotek, używając klasy Tuple? Coś jak na to:

List<Tuple<String, Object>> list = new List<Tuple<String, Object>>(); 
0

Czy rozważałeś użycie "Grupuj według", a następnie przekształciłeś zgrupowany wynik w słownik?

+0

Nie jestem pewien, czy zadziała w tym przypadku. – eugeneK

Powiązane problemy