C# 访问数组项:";至于;循环工程和;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中的实现是

我正在尝试为我的解决方案将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(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;}}返回结果;另外:只需
返回trueif()
条件下的code>。一旦你找到了一个好结果,你就可以节省额外的工作。你使用数组“a”和数组“b”中的值来索引数组,这就是问题所在。您想要的是-->bool result=false;foreach(inti在a){foreach(intj在b){if(i+j==v)result=true;}}返回结果;另外:只需
返回trueif()
条件下的code>。一旦你找到一个好的结果,这将节省你做额外的工作而不是设置结果值。这将使算法从
下降到
n log(n)
@JoelCoehoorn虽然准确,但也超出了问题的范围:只是
返回true而不是设置结果值。这使得算法从
下降到
n log(n)
@JoelCoehoorn虽然准确,但超出了问题的范围
public static bool sumOfTwo(int[] a, int[] b, int v)
{
    return a.Any(A => b.Any(B => B + A == v));
}