You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LINQ ToDictionary()将Assignment列表转为复合键字典?

解决方法:用LINQ将列表按复合键转换为指定字典

你可以通过先分组再转字典的方式实现需求,核心是利用GroupBy聚合相同复合键(Id+Name)的条目,再通过ToDictionary生成目标类型的字典。下面是完整的实现代码:

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

// 假设你的Assignment类和列表已经定义完成
List<Assignment> list = new List<Assignment>();

// 核心转换逻辑
Dictionary<Tuple<string, string>, ICollection<Tuple<string, string>>> dict = list
    // 第一步:按Id和Name组成的复合键分组,聚合相同键的所有条目
    .GroupBy(assignment => Tuple.Create(assignment.Id, assignment.Name))
    // 第二步:将分组结果转换为目标字典
    .ToDictionary(
        // 字典的键直接复用分组的复合Tuple
        group => group.Key,
        // 字典的值:把组内每个Assignment转成Product/Content的Tuple,再转成ICollection
        group => group.Select(item => Tuple.Create(item.Product, item.Content))
                      .ToList() // List<T>天然实现了ICollection<T>,刚好匹配类型要求
    );

关键步骤拆解:

  1. GroupBy分组:GroupBy(assignment => Tuple.Create(assignment.Id, assignment.Name))会自动把所有Id和Name完全相同的Assignment归为一组,每组的键就是你需要的复合Tuple。
  2. ToDictionary转换:
    • 第一个参数指定字典的键为分组的复合键;
    • 第二个参数将组内的每个Assignment映射为Product和Content的Tuple,再用ToList()生成集合——因为List<T>继承自ICollection<T>,完全满足字典值的类型要求。

使用验证:

你可以按照预期的方式获取对应集合:

if (dict.TryGetValue(Tuple.Create("123", "Username"), out var collection))
{
    // 成功获取集合后,可遍历处理其中的Product/Content条目
    foreach (var item in collection)
    {
        Console.WriteLine($"Product: {item.Item1}, Content: {item.Item2}");
    }
}

如果你的项目使用较新的.NET版本(如.NET Core 2.0+、.NET Framework 4.7+),也可以考虑用更简洁的ValueTuple替代Tuple(语法更直观,比如(string Id, string Name)),但如果必须严格遵循Tuple的类型要求,上面的代码完全满足你的需求。

内容的提问来源于stack exchange,提问作者Damo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:42:29