Преобразование кортежав словарь - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь преобразовать Tuple<List<Guid>, string> в Dictionary<Guid, List<string>>.Это то, что у меня есть:

var listOfTuples = GetListOfTuples(); // returns type List<Tuple<List<Guid>, string>>
var transformedDictionary = new Dictionary<Guid, List<string>>();
foreach (var listOfTuple in listOfTuples)
{
    foreach (var key in listOfTuple.Item1)
    {
        if (!transformedDictionary.ContainsKey(key)) 
            transformedDictionary[key] = new List<string> { listOfTuple.Item2 };
        else transformedDictionary[key].Add(listOfTuple.Item2);
    }
}

Есть ли лучший способ сделать это, возможно, с помощью LINQ;SelectMany, Grouping или toDictionary?

Обновление : я пробовал это, но явно не работает:

listOfTuples.ToList()
 .SelectMany(x => x.Item1,(y, z) => new { key = y.Item2, value = z })
 .GroupBy(p => p.key)
 .ToDictionary(x => x.Key, x => x.Select(m => m.key));

1 Ответ

0 голосов
/ 11 октября 2018

Вы рядом.Проблема заключается в выборе правильной клавиши и значения

var result = listOfTuples.SelectMany(t => t.Item1.Select(g => (g, str: t.Item2)))
                         .GroupBy(item => item.g, item => item.str)
                         .ToDictionary(g => g.Key, g => g.ToList());

Ошибка здесь (y, z) => new { key = y.Item2, value = z } - вы хотите, чтобы key был Guid и, следовательно, вместо Item2 он долженбыть z, что является Guid.Таким образом, вы можете пойти так, как я написал, или просто

(y, z) => new { key = z, value = y.Item2 }

Также .ToList() в начале не требуется.Вы говорите, что listOfTuples уже возвращает список

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...