You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数组转换为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来分组。具体步骤如下:

  1. 用Select((value, index) => ...)把每个元素和它的索引配对成匿名类型
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:29:23