【问题标题】:How do you go through two int arrays and sum their values if they exist如果它们存在,你如何遍历两个 int 数组并将它们的值相加
【发布时间】:2013-05-01 05:07:35
【问题描述】:

我想创建一个可以发送两个数组(将包含整数)的方法。这些数组不一定一样长。例如,第一个数组的索引可能为 15,而第二个数组的索引为 12。在这种情况下,我想为前 12 个添加 array1 和 array2,然后获取最后 3 个的 array1 的值。

我是这样想的:

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 数组是否为空。我读了一些关于做的事情: if(i

但这似乎也不起作用,它说在我的情况下它总是正确的。 我是在正确的轨道上,还是我遗漏了一些重大缺陷? :)

【问题讨论】:

  • 如果另一个数组为空,我们是否允许返回原始数组,或者必须返回一个副本?如果两者都为空,应该返回什么?这个15 来自哪里?如果它不为空,那是否总是数组的长度?
  • 哦,是的,抱歉忘记添加了。基本上我想要做的是获得一个具有 15 个 int 值的数组,要么 arr1+arr2 要么只是 arr1(如果 arr2 不存在)或 arr2(如果 arr1 不存在),或者如果 arr1 和 arr2 都不存在则只有 0 .

标签: c# arrays


【解决方案1】:

怎么样:

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

【讨论】:

  • @Xerion 请注意,如果ab 为空,这将为您提供空引用异常。您的原始规范似乎表明这是一种可能性,但如果这对您有用,那么我猜它不是?
  • @MatthewWatson 添加了空检查
  • thnx,是的,我需要那个。还是个新手,所以你好心提醒我:)
【解决方案2】:

之前尝试检查两个数组的长度:

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

然后迭代并仅分配从 0 到较短数组长度的数组索引 - 1:

for (int i = 0; i < 15; i++)
    if (i < length)
        newArray[i] = array1[i] + array2[i];
    else
        newArray[i] = 0;

【讨论】:

    【解决方案3】:
            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();
    

    【讨论】:

      【解决方案4】:

      你可以使用 Linq:

      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();
      }
      

      【讨论】:

        【解决方案5】:

        使用 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();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-22
          • 2020-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多