2013-05-07 136 views
0

我想創建一個方法,我可以發送兩個數組(將包含整數)。這些陣列不一定會同樣長。例如,第一個數組的索引可以是15,而第二個數組的索引是12.在這種情況下,我想爲前12個數組添加array1和array2,然後僅獲取最後3個數組的array1的值。如何通過兩個int數組並將它們的值相加,如果它們存在

我認爲是這樣的:

int[] ArrTotal(int[] array1, int[] array2) 
    { 
     int[] total = new int[15]; 

     for (int i = 0; i < 15; i++) 
     { 
      if (array1[i] != null && array2[i] != null) 
      { 
       total[i] = array1[i] + array2[i]; 
      } 
      else if(array1[i] != null) 
      { 
       total[i] = array1[i]; 
      } 
      else if (array2[i] != null) 
      { 
       total[i] = array2[i]; 
      } 
      else 
      { 
       total[i] = 0; 
      } 
     } 

     return total; 
    } 

問題是,我無法檢查,看看如果一個int數組爲空。我讀了一些關於做一個: 如果(我< array1.Length)

但這似乎並不奏效,它說它將永遠是我的情況。 我在正確的軌道上,還是有一些我缺少的重大缺陷? :)

+0

我們現在可以回到原來的數組,如果另外一個爲空或*必須*我們返回副本?如果兩者都爲空,應該返回什麼?這個'15'從哪裏來?如果它不爲null,它總是會成爲數組的長度嗎? – 2013-05-07 09:45:53

+0

哦,是的,很抱歉忘了補充一點。基本上我想要做的是獲得一個15個int值的數組,或者arr1 + arr2或者只是arr1(如果arr2不存在)或者arr2(如果arr1不存在),或者如果arr1和arr2不存在則只是0 。 – 2013-05-07 09:52:32

回答

4

如何:

int[] ArrTotal(int[] a, int[] b) 
    { 
     if (a == null || b == null) 
     { 
      return (int[])(a ?? b).Clone(); 
     } 
     int length = Math.Max(a.Length, b.Length); 
     int[] result = new int[length]; 
     for (int i = 0; i < length; i++) 
     { 
      int sum = 0; 
      if (a.Length > i) sum += a[i]; 
      if (b.Length > i) sum += b[i]; 
      result[i] = sum; 
     } 
     return result; 
    } 
+0

試一試,看起來不錯,thnx! :) – 2013-05-07 09:49:45

+0

完美的作品。日Thnx! – 2013-05-07 09:57:33

+0

@Xerion注意,如果'a'或'b'爲空,這會給你一個空引用異常。你的原始規範似乎表明這是一種可能性,但如果這對你有用,那麼我猜它不是? – 2013-05-07 10:04:33

1

嘗試查看兩個陣列的長度之前:

int length = (array1.Length < array2.Length ? array1.Length : array2.Length); 

然後迭代,並只從0分配給數組的indeces到較短陣列的長度 - 1 :

for (int i = 0; i < 15; i++) 
    if (i < length) 
     newArray[i] = array1[i] + array2[i]; 
    else 
     newArray[i] = 0; 
0
 int[] a1 = new int[] { 1, 2, 3, 2, 3, 1 }; 
     int[] a2 = new int[] { 1, 2, 3, 2, 3, 1, 3, 2, 3 }; 
     List<int> r = new List<int>(); 
     bool a1_longer = (a1.Length > a2.Length); 
     int length_diff = Math.Abs(a1.Length - a2.Length); 
     int length = (a1_longer ? a2.Length : a1.Length); 
     for (int i = 0; i < length; i++) r.Add(a1[i] + a2[i]); 
     for (int i = 0; i < length_diff; i++) { 
      r.Add(a1_longer ? a1[length + i] : a2[length+i]); 
     } 
     r.ToArray(); 
0

您可以使用鋰nq:

int[] ArrTotal(int[] array1, int[] array2) 
{ 
    return Enumerable.Repeat(0, Math.Max(array1.Length,array2.Length)) 
     .Select((a, index) => a + 
      ((array1.Length > index) ? array1[index] : 0)+ 
      ((array2.Length > index) ? array2[index] : 0)) 
     .ToArray(); 
} 
0

使用Linq你可以這樣做(它將處理空數組)。您將需要一個using System.Linq源代碼文件的頂部:

int[] ArrTotal(int[] array1, int[] array2) 
{ 
    if ((array1 == null) && (array2 == null)) 
     return new int[0]; // Zero length array - put some other number here if you need! 
    else if (array1 == null) 
     return (int[])array2.Clone(); // Result will just be a copy of the non-null array. 
    else if (array2 == null) 
     return (int[]) array1.Clone(); // Result will just be a copy of the non-null array. 
    else 
    { 
     int skip = Math.Min(array1.Length, array2.Length); 

     return Enumerable 
      .Zip(array1, array2, (i1, i2) => i1 + i2) 
      .Concat(array1.Skip(skip)) 
      .Concat(array2.Skip(skip)) 
      .ToArray(); 
    } 
} 
相關問題