在求和两个元素时如何调整数组的大小?

时间:2019-02-25 17:41:31

标签: c# arrays .net

想象一下,我有一个像这样的数组{7, 2, 8, 9, 4, 13, 7, 1, 9, 10} 我想要这个数组{9, 17, 17, 8, 19}

原始列表中的第一对折叠为9(7 + 2),第二对折叠为17(8 + 9),依此类推。

我的问题是如何在C#中调整初始数组的大小?

我不想使用另一个具有初始数组一半大小的数组,并且我不能使用List。

5 个答案:

答案 0 :(得分:2)

唯一可以调整数组大小的方法是Array.Resize()。但是,如备注所述:

  

此方法分配具有指定大小的新数组,将元素从旧数组复制到新数组,然后用新数组替换旧数组。

实际上不可能表达您的要求。

现在我们可以质疑原因了。为什么不想要另一个数组?

您可以用此阵列替换旧阵列,垃圾收集器将负责清洁旧阵列。但这与使用Resize()方法相同。

您可以使用列表<>,但是显然不能。您能详细说明为什么吗? List <>在所有.Net框架和库中均可用。

根据您的要求,它看起来很像XY Problem

答案 1 :(得分:1)

您无法使用C#调整初始数组的大小。 C#中的Arrays不可调整大小。 https://docs.microsoft.com/en-us/dotnet/api/system.array?view=netframework-4.7.2

int[] array = { 7, 2, 8, 9, 4, 13, 7, 1, 9, 10 };

您无法调整此数组的大小。

答案 2 :(得分:1)

请假评论this code example

似乎您需要使用Array.Resize方法(MSDN链接为here)。

代码段:

var arr = int[10] {7, 2, 8, 9, 4, 13, 7, 1, 9, 10};
for (int i=0; i<5; i++)
{
   arr[i]=arr[i] + arr[i+1];
}
Array.Resize(ref arr, 5);

答案 3 :(得分:1)

我仅使用数组编写了一个简单的实现。首先,我们遍历数组,然后每隔两个元素执行一次求和。然后删除第二个元素,并在其位置放一个标志(-1000)。

然后我将简单的逻辑用于冒泡排序算法,但只有在找到我们的标志时才进行交换。因此,我们所有的总和都在数组的左侧,而标志在右侧。

然后我使用Take方法获取一半的结果。

        int flag = -1000;
        int[] myValues = new int[] { 7, 2, 8, 9, 4, 13, 7, 1, 9, 10 };
        for (int i = 0; i < myValues.Length; i++)
        {
            if (i % 2 != 0 && i != 0)
            {
                myValues[i - 1] = myValues[i] + myValues[i - 1];
                myValues[i] = flag;
            }
        }
        //clean up remove unwanted flags
        for (int i = 0; i < myValues.Length; i++)
        {
            for (int j = i + 1; j < myValues.Length; j++)
            {
                if (myValues[i] == flag)
                {
                    var temp = myValues[j];
                    myValues[j] = myValues[i];
                    myValues[i] = temp;
                }
            }
        }

        myValues = myValues.Take(myValues.Length / 2).ToArray(); 

答案 4 :(得分:-1)

在位置i上放置ith和i + 1元素的和,在i + 1处删除元素,重复。

  private static List<int> solution(List<int> arr) {
    int s = arr.Count;
    for (int i = 0; i < s; i += 1) {
      arr[i] = arr[i] + arr[i + 1];
      arr.RemoveAt(i + 1);
      s -= 1;
    }
    return arr;
  }