Группировка вложенных пар KeyValue в словарь - PullRequest
1 голос
/ 20 октября 2010

У меня есть следующий код:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;


public class Test
{
    static void Main()
    {

        var list = new List<KeyValuePair<int, KeyValuePair<int, User>>>
                        {
                            new KeyValuePair<int, KeyValuePair<int, User>>(1,new KeyValuePair<int, User>(1,new User {FirstName = "Name1"})),
                            new KeyValuePair<int, KeyValuePair<int, User>>(1,new KeyValuePair<int, User>(1,new User {FirstName = "Name2"})),
                            new KeyValuePair<int, KeyValuePair<int, User>>(1,new KeyValuePair<int, User>(2,new User {FirstName = "Name3"})),
                            new KeyValuePair<int, KeyValuePair<int, User>>(1,new KeyValuePair<int, User>(2,new User {FirstName = "Name4"})),
                            new KeyValuePair<int, KeyValuePair<int, User>>(2,new KeyValuePair<int, User>(3,new User {FirstName = "Name5"})),
                            new KeyValuePair<int, KeyValuePair<int, User>>(2,new KeyValuePair<int, User>(3,new User {FirstName = "Name6"})),
                            new KeyValuePair<int, KeyValuePair<int, User>>(2,new KeyValuePair<int, User>(3,new User {FirstName = "Name6"})),
                            new KeyValuePair<int, KeyValuePair<int, User>>(3,new KeyValuePair<int, User>(4,new User {FirstName = "Name7"})),
                        };
    }
}
public class User
{
    public string FirstName { get; set; }
}

Выше, как вы можете видеть, есть несколько значений для одного и того же ключа для первой пары KeyValue и далее (во второй вложенной ключе Value Value) есть несколько одинаковых ключей.Я хочу сгруппировать их и преобразовать объект списка в словарь, в котором ключ будет таким же (1,2, как показано выше), но первое значение будет словарем, а значение для второго будет коллекцией. Как это:

var outputNeeded = new Dictionary<int,Dictionary<int,Collection<User>>>();

Как я могу это сделать.??

1 Ответ

4 голосов
/ 20 октября 2010

Вы можете использовать LINQ:

var result = list
    .GroupBy(
        x => x.Key,
        x => x.Value)
    .ToDictionary(
        g => g.Key,
        g => g.GroupBy(
                  y => y.Key,
                  y => y.Value)
              .ToDictionary(
                  h => h.Key,
                  h => new Collection<User>(h.ToList())));

Это создает следующую иерархию:

1
 \_ 1
 |   \_ Name1
 |   \_ Name2
 \_ 2
     \_ Name3
     \_ Name4
2
 \_ 3
     \_ Name5
     \_ Name6
     \_ Name6
3
 \_ 4
     \_ Name7

Однако вложенные словари часто не очень удобны в использовании.Я бы, вероятно, предпочел бы простую справочную таблицу:

var result = list
    .ToLookup(
        x => Tuple.Create(x.Key, x.Value.Key),
        x => x.Value.Value);
...