0

我想创建一个可以发送两个数组(将包含整数)的方法。这些阵列不一定同样长。例如,第一个数组的索引可能为 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 < array1.Length)

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

4

5 回答 5

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;
    }
于 2013-05-07T09:42:51.163 回答
1

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

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;
于 2013-05-07T09:44:17.753 回答
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();
    }
}
于 2013-05-07T10:03:24.537 回答
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();
于 2013-05-07T09:53:36.960 回答
0

您可以为此使用 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();
}
于 2013-05-07T09:58:46.827 回答