2010-12-29 13 views
34

Wiem, że możliwe jest przekonwertowanie listy KeyValuePair na słownik, ale czy istnieje szybka metoda (poza ręczną zapętleniem), aby wykonać operację vice versa?Konwertuj słownik na listę <KeyValuePair>

Byłby to sposób ręczny,

foreach (KeyValuePair<double,double> p in dict) 
{ 
    list.Add(new KeyValuePair<double,double>(p.Key,p.Value)); 
} 

Nie tak źle, ale byłem po prostu ciekawy.

+2

nie trzeba tworzyć nowych KeyValuePairs; jest to o wiele prostsze: 'foreach (KeyValuePair p in dict) {list.Add (p); } ' – phoog

Odpowiedz

79

przekonwertować Dictionary<TKey, TValue> Do List<KeyValuePair<TKey, TValue>> można po prostu powiedzieć

var list = dictionary.ToList(); 

lub bardziej gadatliwy

var list = dictionary.ToList<KeyValuePair<TKey, TValue>>(); 

To dlatego Dictionary<TKey, TValue> realizuje IEnumerable<KeyValuePair<TKey, TValue>>.

+8

Warto zauważyć, że trzeba dodać' System.Linq; 'jako użycie. – Harry

+1

To powinno być oznaczone jako odpowiedź –

8

użyciu LINQ: Elementy

myDict.ToList<KeyValuePair<double, double>>(); 

Słownik KeyValuePair przedmiotów.

5

Tak jak powiedział Jason. Ale jeśli tak naprawdę nie potrzebujesz listy, możesz ją po prostu rzucić na ICollection < TKey, TValue >, ponieważ implementuje ten interfejs, ale niektóre części jawnie. Ta metoda działa lepiej, ponieważ nie kopiuje całej listy, tylko ponownie wykorzystuje tę samą instancję słownikową.

+0

'ToList' jedynie kopiuje odniesienia do elementów słownika. Jest to niezwykle szybkie i bardzo mało prawdopodobne, aby był to istotny problem z wydajnością. – jason

+2

Przesyłanie jest nieskończenie szybsze. Co nie jest zauważalne, jeśli robisz to tylko kilka razy z małymi listami, ale mimo to ma to duże znaczenie. – fejesjoco

+1

@Jason: Nie jest prawdą. Wywołanie metody extensionmethod Enumerable.ToList > jest potencjalnie kosztowne. Z innej perspektywy musi zwrócić nową listę, w przeciwnym razie można dodać elementy do słownika, dodając elementy do listy, co byłoby dziwne. – JBSnorro

0

NET 2.0:

Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>(); 
List<KeyValuePair<TKey, TValue>> myList = new List<KeyValuePair<TKey, TValue>>(dictionary); 
0

Próbowałem wyliczyć wystąpienie Exception.Data który jest IDictionary. To właśnie się udało:

ICollection keys = idict.Keys; 
    foreach(var key in keys) 
    { 
     var value = idict[key]; 
     Console.WriteLine("{0}: {1}", key, value); 
    } 
Powiązane problemy