【问题标题】:Return array index from a lambda but throws IndexOutOfRangeException从 lambda 返回数组索引但抛出 IndexOutOfRangeException
【发布时间】:2019-04-27 10:48:32
【问题描述】:

我正在尝试学习如何使用 lambda,在这段代码中,我试图获取数组中可用值的索引,但它只返回值 5 和 8 以及其他值不断投掷IndexOutOfRangeException!

int[] nums = { 2, 3, 5, 8, 9 };

int rez = nums.Where(i => nums[i] == 2).FirstOrDefault();
Console.WriteLine(rez);

请告诉我在尝试检索“索引”返回值时会发生什么情况? 提前致谢。

【问题讨论】:

  • 您了解“IndexOutOfRange”执行的含义吗?这意味着nums[i] 中使用的i 不是num 数组的有效索引。问问自己:num 数组的有效索引范围是多少?
  • 当然可以。在这种情况下,2 应该是 0。出来了吗?
  • 查找Where 的文档。它不会做你认为它会做的事情...... (docs.microsoft.com/en-gb/dotnet/api/…)
  • 但是“i”不应该计算为 0 吗?
  • 再次查看文档以了解它的作用。 不要坚持盲目猜测......

标签: c# linq lambda return indexoutofboundsexception


【解决方案1】:

在您的 lambda 表达式 (i => nums[i] == 2) 中,i 将代表数字本身而不是它的索引,因此 nums[i] 将不起作用。

您可以使用Array.IndexOf() 简单地做到这一点:

int rez =  Array.IndexOf(nums, 2);

或者如果你坚持用 Linq 做(不推荐):

int rez = nums.Select((x, i) => new {x, i}).FirstOrDefault(a => a.x == 2).i;

【讨论】:

  • 伟大的 Akhkan,你能解释一下你的 Linq 是如何工作的吗?我的意思是它如何用于其他索引?
  • @Ashkan 您需要向 .FirstOrDefault(n => n.x == 2) 添加条件。否则,你只会得到第一个元素。
  • 在(x,i)中,x是项目本身,i是索引,所以Select would return: [{x =2, i =0}, {x=3, i = 1}, {x=5, i=2}, ...], so FirstOrDefault(a => ax == 2)` 表示我们新集合中的项目x 值为2 ,并且在找到其i 属性后将成为索引。但它比 indexof 慢得多,所以我建议使用 indexof。
  • @AshkanMobayenKhiabani 太好了,我只需要学习以备将来使用 Linq 和 Lambda
  • @AshkanMobayenKhiabani 当然这是很好的帮助和教程。
【解决方案2】:

i 在您的 lambda 中是 nums 数组的一个元素(而不是索引)。

所以,第一个 i 等于 2(nums 的第一个元素)。 nums[2] != 2,所以它更进一步。

i 等于 3(nums 的第二个元素)。 nums[3] != 2,所以它更进一步。

然后,i 等于 5(nums 的第三个元素)。nums[5] != 2 但您的数组有 5 个元素,最后一个元素的索引为 4(因为索引从零开始)。因此,当您尝试访问 nums[5] 时,您会得到一个 IndexOutOfRangeException。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多