2009-09-06 13 views
26

Czy istnieje wbudowana funkcja do przekształcania tablicy łańcuchów znaków w słownik ciągów znaków lub czy należy tutaj wykonać pętlę?Najbardziej elegancki sposób na konwersję tablicy ciągów znaków do słownika łańcuchów znaków

+0

zależy od strukturę, którą chcesz w sumie. W końcu otrzymasz pętlę, bez względu na to, jak na nią patrzysz. –

+3

Zawsze będzie gdzieś pętla, ale LINQ pozwala ci ją ukryć - tzn. Nie musisz mieć pętli w * twoim * kodzie. –

Odpowiedz

63

Zakładając, że używasz .NET 3.5, można włączyć dowolną sekwencję (tj IEnumerable<T>) do słownika:

var dictionary = sequence.ToDictionary(item => item.Key, 
             item => item.Value) 

gdzie Key i Value są odpowiednie właściwości chcesz działać jako klucz i wartość. Możesz określić tylko jedną projekcję, która jest używana dla klucza, jeśli sam przedmiot jest wartością, którą chcesz.

Tak na przykład, jeśli chcesz mapować górną obudowę wersję każdej struny do oryginału, można użyć:

var dictionary = strings.ToDictionary(x => x.ToUpper()); 

W twoim przypadku, co chcesz, klucze i wartości być?

Jeśli faktycznie tylko chcesz ustawić (co można sprawdzić, czy zawiera określony ciąg znaków, na przykład), można użyć:

var words = new HashSet<string>(listOfStrings); 
+0

Ten plik RIS jest zawsze dostępny, chyba że wcześniej sprawdziłeś, czy nie zawiera on duplikatów kluczy. – Dykam

+0

@Dykam: Rzeczywiście. Jeśli chcesz obsługiwać duplikaty, możesz zamiast tego użyć 'ToLookup'. Mamy nadzieję, że dowiemy się więcej, jeśli OP wyjaśni, co naprawdę próbują zrobić. –

+0

Super! Co się stanie, jeśli mam ciąg tablic kluczy i tablicę znaków o tej samej długości? Czy może mi pomóc Linq? –

3

Co masz na myśli?

Słownik to skrót, w którym klucze są mapowane na wartości.

Jakie są Twoje klucze i jakie są Twoje wartości?

foreach(var entry in myStringArray) 
    myDictionary.Add(????, entry); 
12

Można użyć LINQ to zrobić, ale pytanie, że Andrzej pyta najpierw należy odpowiedzieć (jakie są twoje klucze i wartości):

using System.Linq; 

string[] myArray = new[] { "A", "B", "C" }; 
myArray.ToDictionary(key => key, value => value); 

wynik jest słownikiem tak:

A -> A 
B -> B 
C -> C 
4

Jeśli potrzebujesz słownika bez wartości, może trzeba HashSet:

var hashset = new HashSet<string>(stringsArray); 
2

IMO, Gdy mówimy o Array mówimy o listę wartości, które możemy uzyskać wartość z nazywając swój indeks (value => array [index]), więc poprawny słownik jest słownikiem z kluczem indeksu.

A dzięki dzięki @John Skeet, właściwą drogą do osiągnięcia tego celu jest:

var dictionary = array 
    .Select((v, i) => new {Key = i, Value = v}) 
    .ToDictionary(o => o.Key, o => o.Value); 

Innym sposobem jest użycie metody rozszerzenie takiego:

public static Dictionary<int, T> ToDictionary<T>(this IEnumerable<T> array) 
{ 
    return array 
     .Select((v, i) => new {Key = i, Value = v}) 
     .ToDictionary(o => o.Key, o => o.Value); 
} 
+0

To będzie a) nieefektywne; b) nie działa, jeśli ta sama wartość występuje więcej niż raz w tablicy. Możesz użyć przeciążenia 'Select', które zapewnia również indeks, aby zrobić to wydajniej i niezawodnie. –

+0

Dzięki, i edytuję kod tak jak używałeś 'Wybierz';). –

Powiązane problemy