如何将IEnumerable<DateTimeInterval>转换为Dictionary<Guid,IEnumerable<DateTimeInterval>>
问题原因
ToDictionary()方法的设计逻辑本身就是每个键对应唯一的单个值,要求源序列中不能有重复的键选择器返回值,否则运行时会直接抛出「已存在相同键」的异常。你之前的写法本质是把每个元素直接映射为值,自然得到的是Dictionary<Guid, DateTimeInterval>类型,完全不符合你要把同键元素聚合为集合的需求。- 你给出的
DateTimeInterval类存在命名笔误:构造函数里赋值的Key是大写开头,但属性定义是小写key,实际运行会报编译错误,建议统一属性命名为大写Key,也符合C#通用命名规范。
正确实现方式
你需要先调用GroupBy()方法按Key属性对序列分组,再把分组结果转成字典:
// yourDateTimeIntervalList 为你待转换的IEnumerable<DateTimeInterval>源序列 Dictionary<Guid, IEnumerable<DateTimeInterval>> result = yourDateTimeIntervalList .GroupBy(x => x.key) .ToDictionary(g => g.Key, g => g.AsEnumerable());
如果你需要值的类型是可增删改的List而非只读的IEnumerable,也可以调整写法:
Dictionary<Guid, List<DateTimeInterval>> result = yourDateTimeIntervalList .GroupBy(x => x.key) .ToDictionary(g => g.Key, g => g.ToList());
如果你使用的是.NET 6及以上版本,也可以直接用ToLookup()方法,它本身就实现了类似IReadOnlyDictionary<TKey, IEnumerable<TElement>>的结构,不需要手动转字典也能满足按键索引取同键集合的需求:
var lookup = yourDateTimeIntervalList.ToLookup(x => x.key); // 直接通过lookup[指定的Guid值] 就能拿到对应Key的所有DateTimeInterval集合
内容的提问来源于stack exchange,提问作者I am not Fat
相关产品推荐
相关产品推荐

