【发布时间】:2022-11-21 00:08:03
【问题描述】:
我是 C# 的新手,通过编写经典 100 门问题的解决方案来练习。下面的(可能是坏的)代码解决了这个问题:
internal class Program
{
private static void Main(string[] args)
{
var doors = new bool[100];
var ints = new int[100];
ints = Enumerable.Range(1, 100).ToArray();
for (int i = 1; i <= 100; i++)
{
ints.Where(j => j % i == 0)
.Select(j => j)
.ToList()
.ForEach(j => doors[j - 1] = !doors[j - 1]); //This is the relevant line.
}
Array.ForEach(doors, i => Console.WriteLine(i));
}
}
我发表评论的那一行让我感到惊讶。它工作得很好,但是用下面的任何一个替换它都会抛出System.IndexOutOfRangeException
.ForEach(j => doors[--j] = !doors[--j]);
.ForEach(j => doors[j--] = !doors[j--]);
尽管 j - 1 完全没问题,但为什么这两个都无效?据我了解,在所有情况下,--j 和 j-- 中的一个将等同于 j - 1。
【问题讨论】:
-
在索引超出范围之前需要澄清的重要一点:增量运算符在 (
--j) 之前或之后 (j--) 转换为j = j - 1,变量j在语句中使用。j - 1==j - 1关键区别在于没有对 j 进行赋值
标签: c# linq increment indexoutofboundsexception