c# - 将嵌套键值对分组到字典中

标签 c# generics dictionary key-value

我有以下代码:

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; }
}

正如您所看到的,第一个键值对的相同键有多个值,并且进一步(在第二个嵌套键值对中)有多个相同的键现在我想对它们进行分组并将列表对象转换为字典,其中键将相同(如上所示的 1,2),但第一个值将是字典,第二个值将是集合。如下所示:

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

我该怎么办呢。 ??

最佳答案

您可以使用 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

Nested dictionaries are often not very nice to use, though. I'd probably prefer a simple lookup table:

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

关于c# - 将嵌套键值对分组到字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3978531/

相关文章:

c# - LINQ 查询中 where 子句下的条件顺序是否重要

c# - Web api中的重复键问题

TypeScript 索引访问类型约束行为异常

spring - 在 Spring 中初始化 map

delphi - 在 delphi TDictionary 中查找最大值的最佳方法是什么?

c# - LINQ:如何在Include中引入where?

c# - Xdocument,选择正确的节点

Swift:将通用的 FloatingPoint 值转换为 Int

c# - 如何以 List<T> 作为参数从泛型方法中读取值

python - 打印字典时出现KeyError?