C#展开平面列表<;T>;到字典<;T、 i收集<;int>&燃气轮机;

C#展开平面列表<;T>;到字典<;T、 i收集<;int>&燃气轮机;,c#,linq,dictionary,C#,Linq,Dictionary,我有一个列表: 现在,数据可以(并且确实)如下所示: 一比一,二比九 一比二,二比九 一比一,二比八 一比三,二比七 看到“一”出现两次了吗?我想将此平面序列投影到一个分组的字典中: KeyValuePairOne:{Key:1,Value:{9,8}} KeyValuePairTwo:{Key:2,Value:{9} KeyValuePairTree:{Key:3,Value:{7} 我猜我需要结合使用.GroupBy和.ToDictionary?这就是扩展方法的用途。如果该键出现两次,ToD

我有一个
列表

现在,数据可以(并且确实)如下所示:

一比一,二比九

一比二,二比九

一比一,二比八

一比三,二比七

看到“一”出现两次了吗?我想将此平面序列投影到一个分组的
字典中

KeyValuePairOne:{Key:1,Value:{9,8}}

KeyValuePairTwo:{Key:2,Value:{9}

KeyValuePairTree:{Key:3,Value:{7}

我猜我需要结合使用
.GroupBy
.ToDictionary

这就是扩展方法的用途。如果该键出现两次,ToDictionary将抛出何处,而ToLookup则可以使用它,并执行您正在查找的操作。

var list=new list();
var list = new List<MyClass>();

var dictionary = list.GroupBy(x => x.One)
                     .ToDictionary(x => x.Key, x => x.ToArray());
var dictionary=list.GroupBy(x=>x.One) .ToDictionary(x=>x.Key,x=>x.ToArray());
这正是你要做的:

Dictionary<int, List<MyClass>> result =
    items.GroupBy(x => x.One).ToDictionary(x => x.Key, x => x.ToList());
字典结果=
items.GroupBy(x=>x.One).ToDictionary(x=>x.Key,x=>x.ToList());

你的方向很好。你试过什么?是的,那正是我想要的do@Yorye-我尝试了一个丑陋的循环,我知道这不是正确的方法,但不知道如何使用
.GroupBy
.ToDictionary
在这里一起使用,所以我来到stack寻求帮助。:)@RPM1984您应该已经阅读了这些扩展方法并寻找一些示例。“从互联网上学习而不依赖回答是一项强大的技能。”约里纳森同意。我知道如何单独使用每一个词,只是大脑冻结了,我一辈子都不知道如何组合。ToLookup很像GroupBy,单靠它还不足以解决这个问题(用它来编字典)@YoryeNathan它比GroupBy更简洁:一个词组而不是两个词组。另外,你的答案就是——做一个GroupBy——显然你认为它足够了(或者至少是最好的解决方案)。GroupBy是正确的,但是添加了ToDictionary。ToLookup加上ToDictionary也能起作用。顺便说一下,它一点也不短。我想说的是,由于OP想要一本字典,所以您仍然需要进行编辑。@YoryeNathan gotcha-这很公平。我收回“not shorter”参数,因为我刚才理解了OP想要的
字典,而不是
字典,所以将值选择器传递给LoopUp确实会更简洁。但是,您通过使用不必要的查找来包装它,从而添加了一些调用和委托。为什么不使用var呢?另外,.ToArray()还将进行ICollection,并且效率更高。只有当您打算在ICollection上使用Add/Remove时,才应该创建一个列表。这有点离题,但为什么要使用var呢?具体的定义不是更易读、更简洁吗?@YoryeNathan:这里有三点。第一:一个
列表
也是一个
i集合
;您的代码实际创建的是一个
字典
。第二:如果您没有使用
var
,您会注意到这一点。第三:我测试了两者的10000次迭代。列表:0.9582951秒。阵列:0.957012秒。我认为这无关紧要。更新:这是在调试模式下。在释放模式下,列表:1.13秒,阵列:1.56秒。所以我宁愿使用
List
@minitech是的,我的代码可以做到这一点,但你可以看到OP对我答案的评论。我注意到我的代码就是这样做的,我只是没有注意问题中实际需要的结果。在我看来,使用var使代码更具可读性,最后,在测试数组与列表时,您还应该测试访问元素,我更希望您这样做的方式是,其中一个元素至少需要5秒钟,以便更好地进行比较。众所周知,数组最适合访问元素。正确,但实际上它是
x=>x.Select(y=>y.Two).ToArray()
中的
.ToDictionary>
,因为我想要的是一个
字典
而不是
字典
我的错。但只要你有解决办法,我很高兴。
Dictionary<int, List<MyClass>> result =
    items.GroupBy(x => x.One).ToDictionary(x => x.Key, x => x.ToList());