Mam tablicę, którą chcę przekonwertować na słownik, dzieląc wartości tablicy z równego znaku ({X0}}). Treść przed znakiem równości będzie kluczowym i treścią po tym, jak będzie wartość. Moim problemem jest to, że niektóre wartości z tablicy będą miały tę samą nazwę klucza podczas rozszczepienia i dodanie ich do słownika.

Oto, co mam ...

string[] myArray = new[] { "A=1", "B=2", "C=3", "A=4" };
Dictionary<string, string> myDictionary = myArray.Select(l => l.Split('=')).ToDictionary(a => a[0], a => a[1]);

Zgodnie z oczekiwaniami, otrzymuję błąd: ArgumentException was unhandled by user code Od momentu pierwszego, a ostatnia wartość będzie miała te same klucze.

Co chciałbym być w stanie zrobić, to wykluczyć / ignorować wartości, które wygenerują duplikaty kluczy. Innymi słowy, na podstawie mojego kodu Nie chcę dodawać wartości A=4 do mojego słownika.

Jakiś pomysł, jaki byłby najlepszy sposób na osiągnięcie tego?

FYI - Mój kod działa dobrze, jeśli usunę ostatnią wartość z tablicy.

c#
2
fs_tigre 3 czerwiec 2018, 17:32

3 odpowiedzi

Najlepsza odpowiedź

Używanie GroupBy przed ToDictionary:

var result = myArray.Select(s => s.Split('='))
                    .GroupBy(a => a[0])
                    .ToDictionary(e => e.Key,
                             v => v.Select(a => a[1]).First());

Lub iteracja i sprawdzanie, czy klucz nie jest zawarty w słowniku rezultatu:

Dictionary<string, string> accumulator = new Dictionary<string, string>();
foreach (var item in myArray.Select(x => x.Split('=')))
       if (!accumulator.ContainsKey(item[0]))
           accumulator.Add(item[0], item[1]);
2
Ousmane D. 3 czerwiec 2018, 15:01

Możesz używać Groupby i Grupuj podzielone wartości przez pierwszą wartość (Indeks 0), a następnie uzyskaj pierwszy z każdej grupy (ignoruj innych o tej samej wartości w indeksie 0):

  var  myArray.Select(l => l.Split('=')).GroupBy(x=>x[0]).Select(x=>x.FirstOrDefault());

Lub po prostu zignoruj część podczas dodawania do słownika:

foreach(string[] x in  myArray.Select(l => l.Split('=')).ToArray())
{
     if(!Dic.ContainsKey(x[0]))Dic.Add(x[0], x[1]);
}
1
Ashkan Mobayen Khiabani 3 czerwiec 2018, 14:47

Użyj poniższego kodu, który konwertuje daną tablicę do unikalnego słownika. GroupBy, grupy Dane oparte na lewej stronie klucza, a następnie ToDictionary konwertuje pobrany wynik w słowniku.

 Dictionary<string, string> myDictionary = myArray.Select(l => 
     { 
        var splittedStrings = l.Split('=');
        return new { Key = splittedStrings[0], Val = splittedStrings[1] };
      }).GroupBy(g => g.Key)
     .ToDictionary(a => a.Key, a => a.First().Val);
1
user1672994 3 czerwiec 2018, 15:01