2012-07-08 10 views
7

mamKonwersja Lookup <TKey, TElement> do innych struktur danych C#

Lookup<TKey, TElement> 

gdzie TElement oznacza ciąg słów. Chcę przekonwertować Lookup do:

Dictionary<int ,string []> or List<List<string>> ? 

Czytałem kilka artykułów na temat korzystania z

Lookup<TKey, TElement> 

ale to nie było dla mnie za mało, aby zrozumieć. Z góry dziękuję.

Odpowiedz

8

Można to zrobić przy użyciu następujących metod:

Powiedzmy masz Lookup<int, string> nazywa mylookup z ciągów zawierających kilka słów, a następnie można umieścić IGrouping wartości do string[] i spakuj całość do słownika:

var mydict = mylookup.ToDictionary(x => x.Key, x => x.ToArray()); 

Aktualizacja

Po przeczytaniu Twojego komentarza, wiem, co rzeczywiście chcesz zrobić z odnośnika (patrz OPS previous question). Nie musisz konwertować go na słownik lub listę. Wystarczy skorzystać z odnośnika bezpośrednio:

var wordlist = " aa bb cc ccc ddd ddd aa "; 
var lookup = wordlist.Trim().Split().Distinct().ToLookup(word => word.Length); 

foreach (var grouping in lookup.OrderBy(x => x.Key)) 
{ 
    // grouping.Key contains the word length of the group 
    Console.WriteLine("Words with length {0}:", grouping.Key); 

    foreach (var word in grouping.OrderBy(x => x)) 
    { 
     // do something with every word in the group 
     Console.WriteLine(word); 
    } 
} 

Ponadto, jeżeli zlecenie jest ważne, zawsze można posortować IEnumerable s za pomocą metod rozszerzenie OrderBy lub OrderByDescending.

Edit:

spojrzenie na edytowanej próbki kodu powyżej: Jeśli chcesz zamówić klawisze, wystarczy użyć metody OrderBy. W ten sam sposób można zamówić słowa alfabetycznie za pomocą grouping.OrderBy(x => x).

+0

@Qaesar: I odgadnąć odnosząc się do twojego innego pytania tutaj (http://stackoverflow.com/questions/11378338/spliting-string-into-words-length-based-lists-c-sharp), prawda? Tam masz '' Lookup ''. Co chcesz osiągnąć dokładnie? –

+0

tak, dokładnie. Chcę pogrupować ciąg słów zgodnie z długością słowa. więc jaka struktura jest lepsza? czy mogę dalej używać Lookup ?? ponieważ po tym napiszę każdy TElement (tablica słów) do kolumny Excel. – FSm

+0

Ok, ale słowo musi być podzielone na tablicę lub coś innego. ponieważ później, napiszę każdy (słowo w słowie) do komórki kolumny Excel. – FSm

4

Wyszukiwanie jest zbiorem odwzorowań z klucza na zbiór wartości. Biorąc pod klucz można uzyskać zbiór wartości związanych:

TKey key; 
Lookup<TKey, TValue> lookup; 
IEnumerable<TValue> values = lookup[key]; 

Jak implementuje IEnumerable<IGrouping<TKey, TValue>> można użyć metody rozszerzenie przeliczalny, aby przekształcić go do pożądanych struktur:

Lookup<int, string> lookup = //whatever 
Dictionary<int,string[]> dict = lookup.ToDictionary(grp => grp.Key, grp => grp.ToArray()); 
List<List<string>> lists = lookup.Select(grp => grp.ToList()).ToList(); 
+0

Świetnie, dziękuję. – FSm

+0

DZIĘKUJĘ !! dla "values ​​= lookup [key]". Wszyscy inni mówią: "Hej, możesz przejść przez wyniki" i byłam gotowa zrezygnować z możliwości Linq'a wyszukiwania wyników w tablicy. – bwperrin