访问数组项:"For"循环有效,"Foreach"给出 System.IndexOutOfRangeException



我正在尝试将我的解决方案的 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,不如直接使用 ij 的值:

....
        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() 方法,有效地比较 ab 的每个可能组合,就像原始代码一样,并将结果限制为符合我们a+b=v条件的项目。 Where()也可以为此工作,但Any()更好,因为它会在第一场比赛中停止。

我更愿意为此使用 .Intersect(),这可能会导致代码更容易理解,但是.Intersect()要求您定义整个IEqualityComparer类,而不是简单的委托。

最新更新