C# 访问数组项:";至于;循环工程和;Foreach“;给出System.IndexOutOfRangeException
我正在尝试为我的解决方案将For循环转换为Foreach循环。而For循环则生成所需的输出(见下文)。Foreach生成以下错误: System.IndexOutOfRangeException:“索引超出了数组的边界。”C# 访问数组项:";至于;循环工程和;Foreach“;给出System.IndexOutOfRangeException,c#,arrays,for-loop,foreach,indexoutofrangeexception,C#,Arrays,For Loop,Foreach,Indexoutofrangeexception,我正在尝试为我的解决方案将For循环转换为Foreach循环。而For循环则生成所需的输出(见下文)。Foreach生成以下错误: System.IndexOutOfRangeException:“索引超出了数组的边界。” 您在foreach中的实现完全错误 foreach(a中的int i) i是数组的值。 因此,如果a[0]的值为10,但数组大小小于10,则实际上是在if语句中调用a[10]。您将有越界异常 只用 if(i+j==v)在您的if语句中应该可以工作。您在foreach中的实现是
您在
foreach中的实现完全错误
foreach(a中的int i)
i
是数组的值。
因此,如果a[0]
的值为10
,但数组大小小于10,则实际上是在if语句中调用a[10]
。您将有越界异常
只用
if(i+j==v)
在您的if语句中应该可以工作。您在foreach中的实现是完全错误的
foreach(a中的int i)
i
是数组的值。
因此,如果a[0]
的值为10
,但数组大小小于10,则实际上是在if语句中调用a[10]
。您将有越界异常
只用
if(i+j==v)
在if语句中应该有效。它们之间的区别是for(int i=0;iforeach(int i in a)
给你一个实际值
例如:如果你有一个数组int[]a={10,0,11}
,你会得到以下结果:
for (int i = 0; i < a.Length; i++)
Console.WriteLine(a[i])
// a[0] = 10
// a[1] = 0
// a[2] = 11
foreach (int i in a)
Console.WriteLine(a[i])
// a[10] = IndexOutOfRangeException
// a[0] = 10
// a[11] = IndexOutOfRangeException
它们之间的区别在于,for(int i=0;iforeach(int i in a)
给你一个实际值
例如:如果你有一个数组int[]a={10,0,11}
,你会得到以下结果:
for (int i = 0; i < a.Length; i++)
Console.WriteLine(a[i])
// a[0] = 10
// a[1] = 0
// a[2] = 11
foreach (int i in a)
Console.WriteLine(a[i])
// a[10] = IndexOutOfRangeException
// a[0] = 10
// a[11] = IndexOutOfRangeException
您可以将其归结为一行:
public static bool sumOfTwo(int[] a, int[] b, int v)
{
return a.Any(A => b.Any(B => B + A == v));
}
Any()
方法在序列有任何成员时返回true
iff,否则返回false
。调用Any()
中的其余代码允许您在某些条件谓词上过滤序列,因此只有在过滤器中有任何内容“幸存”时,您才能得到true
对于该条件,我们再次使用Any()
方法和b
序列,与原始代码一样,有效地比较a
和b
的所有可能组合,并将结果限制为与a+b=v
条件匹配的项Where()
也可以用于此,但是Any()
更好,因为它将在第一次匹配时停止
我更喜欢使用.Intersect()
,这可能会导致代码更容易理解,但是。Intersect()
要求您定义一个完整的IEqualityComparer
类,而不是一个简单的委托。您可以将其简化为一行:
public static bool sumOfTwo(int[] a, int[] b, int v)
{
return a.Any(A => b.Any(B => B + A == v));
}
Any()
方法在序列有任何成员时返回true
iff,否则返回false
。调用Any()
中的其余代码允许您在某些条件谓词上过滤序列,因此只有在过滤器中有任何内容“幸存”时,您才能得到true
对于该条件,我们再次使用Any()
方法和b
序列,与原始代码一样,有效地比较a
和b
的所有可能组合,并将结果限制为与a+b=v
条件匹配的项Where()
也可以用于此,但是Any()
更好,因为它将在第一次匹配时停止
我更倾向于使用.Intersect()
,这可能会导致代码更容易理解,但是,Intersect()
要求您定义一个完整的IEqualityComparer
类,而不是一个简单的委托。您使用数组“a”和数组“b”中的值对数组进行索引,这就是问题所在。您想要的是-->bool result=false;foreach(inti在a){foreach(intj在b){if(i+j==v)result=true;}}返回结果;另外:只需返回true在if()
条件下的code>。一旦你找到了一个好结果,你就可以节省额外的工作。你使用数组“a”和数组“b”中的值来索引数组,这就是问题所在。您想要的是-->bool result=false;foreach(inti在a){foreach(intj在b){if(i+j==v)result=true;}}返回结果;另外:只需返回true在if()
条件下的code>。一旦你找到一个好的结果,这将节省你做额外的工作代码>而不是设置结果值。这将使算法从n²
下降到n log(n)
@JoelCoehoorn虽然准确,但也超出了问题的范围:只是返回true代码>而不是设置结果值。这使得算法从n²
下降到n log(n)
@JoelCoehoorn虽然准确,但超出了问题的范围
public static bool sumOfTwo(int[] a, int[] b, int v)
{
return a.Any(A => b.Any(B => B + A == v));
}