使用LINQ扩展将对象添加到嵌套在Dictionary中的List中
本文关键字:Dictionary 中的 List 嵌套 扩展 LINQ 对象 添加 使用 | 更新日期: 2023-09-27 18:06:49
我的Dictionary<T, T>
包含一个键(代表一个类别),List<T>
为空值:
Dictionary<string, List<IMyObject>> myObjects;
每一对看起来像这样:
{ firstCategory, new List<IMyObject>> }
我现在有一个IMyObject
的List<T>
:
List<IMyObject> myObjectsUnsorted;
我想循环通过myObjectsUnsorted
并添加到正确的List<T>
foreach (var myObject in myObjectsUnsorted)
{
myObjects[myObject.Category].Add(myObject);
}
如何在不使用循环的情况下做到这一点?例如用LINQ扩展方法?在这个例子中,我的其他对象都是用.Select()
创建的,但这并不适合最后一个foreach
。
我建议使用查找:
ILookup<string, IMyObject> lookup = myObjectsUnsorted.ToLookup(t => t.Category);
ILookup<,>
被精确地设计为"每个键有多个值"的字典。除了构造起来非常简单之外,它的好处是,如果您查找一个没有表示的键,您将得到一个空序列,而不是一个异常。所以你可以总是只要写:
foreach (var item in lookup[key])
{
...
}
相对于:
IList<MyObject> list;
if (dictionary.TryGetValue(key, out list))
{
foreach (var item in list)
{
...
}
}
请注意,查找是不可变的,因为在构造之后不能更改其中的项。(如果项是可变引用类型,当然可以修改对象本身…)这可能是好事,也可能是坏事,取决于你的情况。
您也可以像这样使用GroupBy
:
var dict = myObjectsUnsorted.GroupBy(q => q.Category)
.ToDictionary(q => q.Key, w => new List<IMyObject>(w));