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

我有一个随机类来随机选择一个数字,如果它是 2 必须以升序从我的数组中删除,每个元素都应该被检查和消除。

4

4 回答 4

2

使用List 类会更容易

List<int> l = new List<int>();
l.Add(2);
l.Add(4);
...
l.Remove(2);
于 2013-09-07T09:24:29.267 回答
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();
于 2013-09-07T09:27:00.867 回答
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将是要省略的元素的索引。

于 2013-09-07T10:37:42.690 回答
0

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

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

所以,从一个示例数组和一个随机索引开始:

// 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 }开始 = 0,长度 = 3
  • 第 2 部分:({ 4, 5, 6, 7 }开始 = 4,长度 = 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可用于将数组的一部分复制到自身之上,这意味着您只需将数组的第二部分向后移动一个位置,然后使用以下命令调整初始数组的大小Array.Resize

// 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);

当然,如果您只是使用 a List<int>,那么您只需使用该List<T>.RemoveAt方法删除该项目:

var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
int indexToRemove = new Random().Next(list.Count);
list.RemoveAt(indexToRemove);
于 2013-09-07T10:20:11.420 回答