将 IEnumerable<Ienumerable<T>> 转换为 Dictionary<key,IEnumerable<T>>
Posted
技术标签:
【中文标题】将 IEnumerable<Ienumerable<T>> 转换为 Dictionary<key,IEnumerable<T>>【英文标题】:Convert an IEnumerable<Ienumerable<T>> to Dictionary<key,IEnumerable<T>> 【发布时间】:2021-11-17 14:41:29 【问题描述】:我目前正在寻找一种可以转换
IEnumerable<DateTimeInterval>
到 Dictionary<Guid, IEnumerable<DateTimeInterval>>
我尝试使用IEnumerable<DateTimeInterval>.ToDictionary(x => x.id)
但这只是返回一个Dictionary<Guid, DateTimeInterval>
而不是想要的Dictionary<Guid, IEnumerable<DateTimeInterval>>
我做错了什么?
dateTimeInterval 是这样定义的:
public class DatetimeInterval
public Guid key get; set;
public DateTime From get; set;
public DateTime To get; set;
public DatetimeInterval(DateTime from, DateTime to, Guid key)
Key = key;
From = from;
To = to;
在IEnumerable<DateTimeInterval>
中可能存在具有相同键的 DateTimeIntervals。
因此我非常希望拥有
IEnumerable.ToDictionary(x => x.key, v => v)
返回
但这只是返回一个Dictionary<Guid, DateTimeInterval>
而不是想要的Dictionary<Guid, IEnumerable<DateTimeInterval>>
【问题讨论】:
stuff.ToDictionary(k => new Guid(...), v => v)
?
@aybe DatetimeInterval 本身有一个id,其中一些是相同的,因此应该存储在列表中
向您的问题添加更多代码,因为不清楚。
@aybe 添加了更多代码.. 不确定这里有什么不确定..
您是否在寻找ToLookup
而不是ToDictionary
?字典是 1:1 键:值,而听起来您正在寻找 1:许多键:值,因为 DateTimeInterval
可以有重复的 ID
【参考方案1】:
对于这个用例,通常会使用Lookup 而不是字典:
var myLookup = myEnumerable.ToLookup(interval => interval.Id);
这将创建一个ILookup<Guid, DateTimeInterval>
。查找类似于字典,但它将键映射到值的集合,而不是单个值。
如果您出于技术原因需要字典,您可以将 Lookup 转换为“经典”字典:
var myDictionary = myLookup.ToDictionary(x => x.Key);
【讨论】:
如果这会创建一个Lookup<Guid, DateTimeInterval>
,那么我如何能够检索具有特定 entity_id 的 DateTimeInterval 列表??
@IamnotFat:使用myLookup[myEntityId]
,这将是return an IEnumerable<DateTimeInterval>
。通常,ILookup<K, V>
的索引器将返回 IEnumerable<V>
(与字典相反,它只会返回 V
)。【参考方案2】:
Dictionary<Guid, IEnumerable<DatetimeInterval>> target = source
.ToLookup(di => di.key, di => di)
.ToDictionary(@group => @group.Key, @group => @group.Select(item => item));
ToLookup
根据指定属性对项目进行分组
ToDictionary
将 ILookup
实现转换为 Dictionary
Select
有助于将 IGrouping
转换为 IEnumerable
【讨论】:
【参考方案3】:var result = source
.GroupBy(x => x.Key)
.ToDictionary(
g => g.Key,
g => (IEnumerable<DateTimeInterval>)g);
【讨论】:
以上是关于将 IEnumerable<Ienumerable<T>> 转换为 Dictionary<key,IEnumerable<T>>的主要内容,如果未能解决你的问题,请参考以下文章
如何将多个 IEnumerable<IEnumerable<T>> 列表添加到 IEnumerable<List<int>>
如何将两个 IEnumerable<T> 连接成一个新的 IEnumerable<T>?
无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”