如何将数组转换为Lookup数据结构及LINQ代码编译问题排查
解决ToLookup实现索引链表的问题
嘿,我来帮你捋清楚这个问题~首先你想要的是数组中每个唯一数字对应它所有出现的索引列表,这个需求本身没问题,但你的代码之所以编译失败,是因为对ToLookup的重载用法理解错啦,而且逻辑也搞反了。
原代码的问题在哪?
你写的这段代码:
var lookUp = prices.ToLookup<int,int>((x, i) => i + 1);
有两个关键错误:
- 你用的
ToLookup重载,第二个参数i并不是数组的索引!这个重载的签名是ToLookup<TElement, TKey>(IEnumerable<TElement>, Func<TElement,TKey>, Func<TElement,TResult>),第二个参数是用来转换元素值的投影器,不是获取索引的参数。 - 逻辑完全反了:你需要把数组元素作为Lookup的键,而索引作为对应的值,但你现在把索引(还加了1)当成了键,这根本不是你想要的结果。
正确的实现方式
要实现你的需求,得先把数组的每个元素和它的索引绑定在一起,然后再用ToLookup来分组。具体步骤如下:
- 用
Select((value, index) => ...)把每个元素和它的索引配对成匿名类型 - 调用
ToLookup,把匿名类型里的Value作为键,Index作为对应的值
完整代码示例:
var prices = new int[] { 2, 2, 4, 3 }; // 先绑定元素和索引,再构建Lookup var lookUp = prices .Select((value, index) => new { Value = value, Index = index }) .ToLookup(item => item.Value, item => item.Index);
验证结果
现在你可以这样访问结果:
lookUp[2]会返回包含0和1的序列lookUp[4]返回包含2的序列lookUp[3]返回包含3的序列
完全符合你想要的效果~
内容的提问来源于stack exchange,提问作者RBT
相关产品推荐
相关产品推荐

