使用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>> }

我现在有一个IMyObjectList<T>:

List<IMyObject> myObjectsUnsorted;

我想循环通过myObjectsUnsorted并添加到正确的List<T>

foreach (var myObject in myObjectsUnsorted)
{
    myObjects[myObject.Category].Add(myObject);
}

如何在不使用循环的情况下做到这一点?例如用LINQ扩展方法?在这个例子中,我的其他对象都是用.Select()创建的,但这并不适合最后一个foreach

使用LINQ扩展将对象添加到嵌套在Dictionary中的List中

我建议使用查找:

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));