2017-04-10 32 views
0

我想为我的解决方案For循环转换为Foreach循环。而For循环产生我想要的输出(见下文)。的foreach生成以下错误:访问数组项目:“For”循环工作和“Foreach”给出System.IndexOutOfRangeException

System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

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; 
     } 
+0

您正在使用数组“a”和数组“b”中的值来索引数组,这就是问题所在。你想要的是 - > bool result = false; (i + j == v) result = true;如果(i + j == v) 结果= true;如果(i + j == v) 结果=真;如果(i + j == v) 结果=真; } } 返回结果; –

+0

另请参见:只在'if()'条件中'返回true;'。一旦你找到了好的结果,这将节省你做额外的工作。 –

回答

3

他们之间的区别是,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 

因此,而不是使用数组访问器在代码的第二位,你应该使用的i & j值直接:

.... 
     foreach (int j in b) 
     { 
      if (i + j == v) 
       result = true; 
     } 
.... 
+0

另外:只是'返回true;'而不是设置结果值。这将算法从'n2'降到'n log(n)'。 –

+0

@JoelCoehoorn虽然准确,但它超出了 –

1

您实现在foreach
foreach (int i in a)
i完全错误的是阵列的价值。
因此,如果a[0]的值为10,但是您的数组大小小于10,则您在if语句中实际上调用a[10]。你将有out of bound exception

只是使用 if (i + j == v)在你的if语句应该工作。

1

你可以得到这个下降到一个班轮:

public static bool sumOfTwo(int[] a, int[] b, int v) 
{ 
    return a.Any(A => b.Any(B => B + A == v)); 
} 

如果序列中有任何成员,则Any()方法返回true,否则返回falseAny()调用中的其余代码允许您在某些条件谓词上过滤序列,因此只有在过滤器“存活”的情况下才会变为真。

为条件,我们再次使用Any()方法与b序列,有效地每个可能的组合,从ab比较,就如同当初代码执行,结果限制为配合我们a+b=v条件的项目。 Where()也可以为此工作,但Any()更好,因为它会在第一场比赛中停止。

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

+0

这个问题的范围,你能解释一下它是如何工作的吗? –