我正在尝试将我的解决方案的 For 循环转换为 Foreach 循环。而 For 循环为我生成所需的输出(见下文(。Foreach 生成以下错误:
System.IndexOutOfRangeException:"Index 在数组边界之外。
public static bool sumOfTwo(int[] a, int[] b, int v)
{
bool result = false;
for (int i = 0; i < a.Length; i++)
{
for (int j = 0; j < b.Length; j++)
{
if (a[i] + b[j] == v)
{
result = true;
}
}
}
return result;
}
和我的 foreach 实现:可能出了什么问题?
public static bool sumOfTwo(int[] a, int[] b, int v)
{
bool result = false;
foreach (int i in a)
{
foreach (int j in b)
{
if (a[i] + b[j] == v)
result = true;
}
}
return result;
}
它们之间的区别在于for (int i = 0; i < a.Length; i++)
给你一个指数,而foreach (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
因此,与其在第二段代码中使用 Array Accessors,不如直接使用 i
和 j
的值:
....
foreach (int j in b)
{
if (i + j == v)
result = true;
}
....
你的实现在foreach
是完全错误的 foreach (int i in a)
i
是数组的值。
因此,如果a[0]
的值为 10
但数组大小小于 10,则实际上是在 if 语句中调用a[10]
。你会有out of bound exception
只需使用 if (i + j == v)
if 语句应该有效。
你可以把它简化为一行:
public static bool sumOfTwo(int[] a, int[] b, int v)
{
return a.Any(A => b.Any(B => B + A == v));
}
Any()
方法返回true
序列是否具有任何成员,否则false
返回。调用 Any()
中的其余代码允许您根据某些条件谓词过滤序列,因此只有当过滤器"存活"时,您才会获得 true。
对于条件,我们再次使用b
序列的 Any()
方法,有效地比较 a
和 b
的每个可能组合,就像原始代码一样,并将结果限制为符合我们a+b=v
条件的项目。 Where()
也可以为此工作,但Any()
更好,因为它会在第一场比赛中停止。
我更愿意为此使用 .Intersect()
,这可能会导致代码更容易理解,但是.Intersect()
要求您定义整个IEqualityComparer
类,而不是简单的委托。