重新调整阵列大小

时间:2013-09-07 09:19:17

标签: c#

int oldLength = numbers.Length;
int[] arrTmp = numbers;                  
numbers = new int[oldLength - 1];
Array.Copy(arrTmp, numbers, Token);
Array.Copy(arrTmp, r+1, numbers, Token, oldLength - Token - 1);

这就是我必须从值类型数组中删除指定的元素,但它不起作用。

我有4个值类型数组元素。我已经存储了4个不同的数字。

array[0] = 2;
array[1] = 4;
array[2] = 6;
array[3] = 8;

我有一个随机类随机选择一个数字,如果它必须以递增的顺序从我的数组中删除,则应检查并消除每个元素。

4 个答案:

答案 0 :(得分:2)

使用List class

可以更轻松
List<int> l = new List<int>();
l.Add(2);
l.Add(4);
...
l.Remove(2);

答案 1 :(得分:0)

int oldLength = numbers.Length;
int[] arrTmp = new int[oldLength - 1];
for(int i = 0, j = 0; i < oldLength || j < arrTmp.Length; i++)
{
    if(numbers[i] == Token)
        continue;
    arrTmp[j++] = numbers[i];
}

使用linq:

var newArray = numbers.Where(n=> n!= Token).ToArray();

答案 2 :(得分:0)

如果你真的需要使用普通数组并使用Array.Copy复制它们的内容(这不是在.NET中处理事物的常用方法),那么首先使用 pen 记下您要复制的数组部分的正确索引和长度

在您知道如何解决问题之前开始编写解决方案代码不会让您走得太远。

因此,从示例数组和随机索引开始:

// starting array
int[] array = { 0, 1, 2, 3, 4, 5, 6, 7 };

// index to remove 
int indexToRemove = new Random().Next(array.Length);

现在,假设indexToRemove3并尝试手动执行:

  • 第1部分:{ 0, 1, 2 }(start = 0,length = 3
  • 第2部分:{ 4, 5, 6, 7 }(start = 4,length = 4

从这个具体的例子中,你可以尝试推断这两个数组部分的偏移和长度的通用公式:

  • 第1部分:开始= 0,长度= (indexToRemove - 1)
  • 第2部分:开始= (indexToRemove + 1),长度= (array.Length - indexToRemove - 1)

代码本身就是微不足道的:

var len = array.Length;
var newArray = new int[len - 1];
Array.Copy(array, 0, newArray, 0, indexToRemove - 1);
Array.Copy(array, indexToRemove + 1, newArray, indexToRemove, len - indexToRemove - 1);

此外,Array.Copy可用于复制数组的一部分,这意味着您只需将数组的第二部分移回一个位置,然后使用{{}调整初始数组的大小。 3}}:

// do not create a new array, but simply "move" the 2nd part to left    
Array.Copy(array, indexToRemove + 1, array, indexToRemove, len - indexToRemove - 1);

// finally, resize the original array
Array.Resize(ref array, array.Length - 1);

当然,如果您只使用List<int>,那么您只需使用Array.Resize方法删除该项:

var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
int indexToRemove = new Random().Next(list.Count);
list.RemoveAt(indexToRemove);

答案 3 :(得分:0)

这将是一般方法:

int oldLength = numbers.Length;
int[] arrTmp = numbers;                  
numbers = new int[oldLength - 1];
Array.Copy(arrTmp, numbers, r);
Array.Copy(arrTmp, r + 1, numbers, r, oldLength - r - 1);

请注意在任何地方使用r。这里r将是要省略的元素的索引。