Каков наилучший способ конвертировать один словарь в другой - PullRequest
3 голосов
/ 31 мая 2011

У меня есть один словарь, в котором есть записи, которые выглядят так:

dictionary["ABC.123"] = "Test"
dictionary["DEF.123"] = "Test2"
dictionary["EFG.123"] = "Test3"
dictionary["EFG.343"] = "Test3"
dictionary["ABC.456"] = "Test"

и я хочу создать новый словарь, который выглядит следующим образом: (в основном разбираем начальную строку перед "." И создаем ее в качестве ключа и используем то же значение.

dictionary["ABC"] = "Test"
dictionary["DEF"] = "Test2"
dictionary["EFG"] = "Test3"

как вы можете видеть: между первой частью ключа в первом словаре и значением всегда отображается соотношение 1: 1, поэтому столкновений не будет

Какой самый простой способ использовать LINQ для преобразования, чтобы создать второй словарь из первого ??

Я могу циклически просматривать каждую запись вручную, анализировать новый ключ и создавать каждую новую запись, но я подумал, что есть LINQ способ сделать это

Ответы [ 3 ]

7 голосов
/ 31 мая 2011
var newDict = dictionary.GroupBy(kvp => kvp.Key.Remove(kvp.Key.IndexOf('.')))
                        .ToDictionary(grp => grp.Key, grp => grp.First().Value);

Хотя простой foreach, вероятно, будет более читабельным и эффективным:

var newDict = new Dictionary<string, string>();
foreach (var kvp in dictionary)
{
    newDict[kvp.Key.Remove(kvp.Key.IndexOf('.'))] = kvp.Value;
}
2 голосов
/ 29 марта 2017

Простой подход заключается в использовании метода Select для генерации желаемой KeyValuePair в сочетании с ToDictionary

var response = dictionary
              .Select(kvp => new KeyValuePair<string, string>(kvp.Key.Remove(kvp.Key.IndexOf('.')), kvp.Value))
              .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
2 голосов
/ 31 мая 2011
var dict2 = dictionary.GroupBy(x => x.Key.Split('.')[0])
                      .ToDictionary(g => g.Key, g => g.First().Value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...