Może się to wydawać dziwne, ale pomijając to, czy istnieje ładny, zwięzły sposób konwersji listy na słownik, w której każda para klucz-wartość w słowniku jest po prostu każdym ciągiem z listy. to znaczy
List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
Przeprowadziłem wiele poszukiwań i na samym Stackoverflow są dosłownie dziesiątki przykładów robienia tego w przeciwnym kierunku, ale nie w ten sposób.
Powodem tego jest to, że mam dwie trzecie komponenty części i ich wymiana jest poza moimi rękami. Jeden zwraca listę adresów e-mail w postaci listy, a drugi wysyła e-maile, w których parametr Do oznacza słownik. Kluczem do słownika jest adres e-mail, a wartością jest ich prawdziwe imię i nazwisko. Jednak nie znam prawdziwego nazwiska, ale nadal działa, jeśli ustawisz prawdziwe imię również na adres e-mail. Dlatego chcę przekonwertować listę na słownik. Można to zrobić na wiele sposobów. Pętla foreach na liście, która dodaje kvp do słownika. Ale ja lubię zwięzły kod i zastanawiałem się, czy istnieje rozwiązanie jednokreskowe.
źródło
Odpowiedzi:
Spróbuj tego:
Pierwsza lambda pozwala wybrać klucz, druga wybiera wartość.
Możesz się nim bawić i sprawić, by wartości różniły się od klawiszy, na przykład:
Jeśli lista zawiera duplikaty, dodaj w
Distinct()
ten sposób:EDYCJA Aby skomentować ważny powód, myślę, że jedynym powodem, który może być ważny dla takich konwersji, jest to, że w pewnym momencie klucze i wartości w wynikowym słowniku będą się różnić. Na przykład wykonasz początkową konwersję, a następnie zastąpisz niektóre wartości czymś innym. Jeśli klucze i wartości będą zawsze takie same,
HashSet<String>
zapewni to znacznie lepsze dopasowanie do Twojej sytuacji:źródło
.Distinct()
po,list
aby tego uniknąć.Użyj tego:
Zobacz MSDN uzyskać więcej informacji, .
Jak wskazuje Pranay w komentarzach, nie powiedzie się to, jeśli element istnieje na liście wiele razy.
W zależności od konkretnych wymagań możesz użyć,
var dict = list.Distinct().ToDictionary(x => x);
aby uzyskać słownik różnych elementów lubToLookup
zamiast tego:To zwróci,
ILookup<string, string>
który jest zasadniczo taki sam jakIDictionary<string, IEnumerable<string>>
, więc będziesz mieć listę odrębnych kluczy z każdą instancją ciągu pod nią.źródło
Używając
ToDictionary
:Jeśli jest możliwe, że dowolny ciąg może się powtórzyć, albo wykonaj
Distinct
wywołanie najpierw na liście (aby usunąć duplikaty), albo użyj,ToLookup
który pozwala na wiele wartości na klucz.źródło
Możesz użyć:
źródło
EDYTOWAĆ
Innym sposobem radzenia sobie z duplikatem jest to, że możesz to zrobić
lub
łatwy sposób to zrobić
ale upewnij się, że żaden ciąg się nie powtarza ... znowu inny powyższy kod nie będzie działał dla Ciebie
jeśli istnieje ciąg, to się powtarza, niż lepiej zrobić to w ten sposób
źródło