C# 使用LINQ扩展将对象添加到嵌套在字典中的列表中

C# 使用LINQ扩展将对象添加到嵌套在字典中的列表中,c#,linq,dictionary,foreach,C#,Linq,Dictionary,Foreach,我有一个字典,其中包含一个键,该键表示一个以空列表作为值的类别: Dictionary<string, List<IMyObject>> myObjects; 我想通过myObjectsSorted循环并添加到正确的列表中 没有循环,我怎么做?例如,使用LINQ扩展方法?本例中我的其他对象是使用创建的。请选择,但这与最后一个foreach中的账单不符。我建议使用: 与之相反: IList<MyObject> list; if (dictionary.TryG

我有一个字典,其中包含一个键,该键表示一个以空列表作为值的类别:

Dictionary<string, List<IMyObject>> myObjects;
我想通过myObjectsSorted循环并添加到正确的列表中

没有循环,我怎么做?例如,使用LINQ扩展方法?本例中我的其他对象是使用创建的。请选择,但这与最后一个foreach中的账单不符。

我建议使用:

与之相反:

IList<MyObject> list;
if (dictionary.TryGetValue(key, out list))
{
    foreach (var item in list)
    {
        ...
    }
}
请注意,查找是不可变的,因为在构造之后您不能更改其中的项目。如果项目是可变引用类型,您当然可以修改对象本身。。。这可能是一种祝福,也可能是一种诅咒,这取决于你的情况……

我建议你改用:

与之相反:

IList<MyObject> list;
if (dictionary.TryGetValue(key, out list))
{
    foreach (var item in list)
    {
        ...
    }
}
请注意,查找是不可变的,因为在构造之后您不能更改其中的项目。如果项目是可变引用类型,您当然可以修改对象本身。。。这可能是一种祝福,也可能是一种诅咒,这取决于你的情况……

你也可以像这样使用GroupBy:

您也可以像这样使用GroupBy:


因此,您基本上希望在列表中的任何位置使用一个表达式执行for/eachWHERE?字典是否已经存在,并且您只希望追加?如果是这样的话,我看没有理由不使用foreach。那么您基本上是想在一个列表中有一个表达式的地方执行for/eachWHERE吗?字典是否已经存在并且您只想追加?如果是这样,我认为没有理由不使用foreach。值得一提的是,这会创建一个不可变的数据结构,因此不可能像字典解决方案中那样进行进一步的添加/删除。20行变为1行,非常感谢!现在我终于明白了我的意思,还有奖金!知道Immutable绝对是件好事,幸运的是这一次它是一件好事。我在视图中使用该对,所以我只在查找{…}中执行foreach var项,就像我在字典中所做的一样。你看,我用钥匙作为标题。乔恩,关于祝福或诅咒的最后一句话只是。。。太神了值得一提的是,这会创建一个不可变的数据结构,因此不可能像dictionary解决方案中那样进行进一步的添加/删除。20行变成1行,非常感谢!现在我终于明白了我的意思,还有奖金!知道Immutable绝对是件好事,幸运的是这一次它是一件好事。我在视图中使用该对,所以我只在查找{…}中执行foreach var项,就像我在字典中所做的一样。你看,我用钥匙作为标题。乔恩,关于祝福或诅咒的最后一句话只是。。。太棒了@乔恩·斯基特的回答很有魅力,但将来知道这一点肯定很好!谢谢我刚刚意识到唯一的区别似乎是。ToLookup返回一个ILookup,.GroupBy返回一个IEnumerable。我没弄错吧?@Oskar还有GroupBy之后的ToDictionary,它将IEnumerable更改为DictionaryYeah我注意到,所以一开始我认为这是获得有用信息的必要条件,但后来我意识到。GroupBy本身工作得很好,就像。托卢库普:@Jon Skeet的回答很有魅力,但将来知道这一点肯定很好!谢谢我刚刚意识到唯一的区别似乎是。ToLookup返回一个ILookup,.GroupBy返回一个IEnumerable。我说得对吗?@Oskar GroupBy之后还有ToDictionary,它将IEnumerable更改为DictionaryYeah我注意到,所以一开始我认为这是获得有用信息的必要条件,但后来我意识到。GroupBy本身工作得很好,就像。ToLookup:
foreach (var myObject in myObjectsUnsorted)
{
    myObjects[myObject.Category].Add(myObject);
}
ILookup<string, IMyObject> lookup = myObjectsUnsorted.ToLookup(t => t.Category);
foreach (var item in lookup[key])
{
    ...
}
IList<MyObject> list;
if (dictionary.TryGetValue(key, out list))
{
    foreach (var item in list)
    {
        ...
    }
}
var dict = myObjectsUnsorted.GroupBy(q => q.Category)
                            .ToDictionary(q => q.Key, w => new List<IMyObject>(w));