GroupBy 后转为 Dictionary

GroupBy 后转为 Dictionary

分组后可以用 ToDictionary 把结果转成字典,分组键作为 Key,组内数据作为 Value。

static void Main(string[] args)
{
    using (var dbContext = new DataClasses1DataContext())
    {
        // 分组键 → Dictionary<Key, Dictionary<ID, User>>
        var q = dbContext.User
                .GroupBy(m => m.Name)
                .ToDictionary(
                    m => m.Key,                    // 分组键(Name)作为外层字典的 Key
                    m => m.ToDictionary(a => a.ID) // 组内每条记录转成以 ID 为 Key 的字典
                );

        var list = q.ToList();

        // 分组键 → Dictionary<Key, IGrouping>
        var q2 = dbContext.User
                 .GroupBy(m => m.Name)
                 .ToDictionary(m => m.Key);

        var list2 = q2.ToList();
    }
}Code language: JavaScript (javascript)

结果结构:

写法字典类型Value 内容
ToDictionary(m => m.Key, m => m.ToDictionary(a => a.ID))Dictionary<string, Dictionary<int, User>>外层按 Name 分组,内层每个分组按 ID 索引 User
`ToDictionary(m => m.Key)“Dictionary<string, IGrouping<string, User>>Value 是分组对象,可遍历

访问方式:

// 取"张三"组下 ID=1 的用户
User u = q["张三"][1];

// 遍历"张三"组所有用户
foreach (var user in q2["张三"])
{
    Console.WriteLine(user.Name);
}Code language: PHP (php)

关键要点:

要点说明
ToDictionary在内存中执行,需先 ToList/GroupBy 完成查询
分组键重复如果分组键有重复值,ToDictionary 会抛异常
Value 类型可以是 List<T>Dictionary<K,V>IGrouping
m.ToDictionary(a => a.ID)组内每条记录以 ID 为 Key 转字典,ID 重复会报错
执行顺序先数据库端 GROUP BY 查回数据,再客户端 ToDictionary

变体写法:

// Value 直接存为 List
var dict = dbContext.User
            .GroupBy(m => m.Name)
            .ToDictionary(
                m => m.Key,
                m => m.ToList()  // Value 是 List<User>
            );Code language: JavaScript (javascript)

字典 Key 重复时会抛 ArgumentException,确保分组键唯一或提前处理。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注