LINQ-将列表转换为字典,并将值作为列表


99

我有一个

List<MyObject> 

我从数据库中检索到的。但是,我希望它通过MyObject中的属性进行键控以进行分组。使用LINQ将清单转换为以下内容的最佳方法是:

Dictionary<long, List<MyObject>>

我有以下内容:

myObjectList.ToDictionary(x => x.KeyedProperty)

但它返回:

Dictionary<long, MyObject>

您想要将字典锁定为WHICH MyObject的专有属性吗?-你有他们的整个列表....
詹姆斯·柯伦

Answers:


191

听起来您想将MyObject实例KeyedProperty分组,然后将其放入Dictionary<long,List<MyObject>>。如果是这样,请尝试以下操作

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());

16

您应该在上使用ToLookup扩展方法,如下所示:Enumerable

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

如果要将其放在字典中,则可以使用ToDictionary扩展方法,如下所示:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);

此答案与接受的答案有什么区别?请问ILookup而接受的答案不保留引用?
PatPeter

@PatPeter的想法是,当键和项之间具有一对多关系时,a Lookup<TKey, TValue>可能比a更好Dictionary<TKey, TValue>
casperOne

1
@PatPeter我会说ILookup是更好使用的结构(如果您知道C ++收集算法,它就像字典到字典的multimap一样),但是要牢记一个大因素-创建的查找是不可变的。之后,您将无法添加或删除条目。
gbjbaanb

另一个考虑因素是,尽管ILookup通常是理想的代码内结构,但对于序列化而言,通常处理得不好。
杰夫·B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.