Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调整阵列大小_C# - Fatal编程技术网

C# 调整阵列大小

C# 调整阵列大小,c#,C#,这就是我从值类型数组中删除指定元素的全部方法,但它不起作用 我得到了值类型数组的4个元素。我在里面储存了4个不同的数字 int oldLength = numbers.Length; int[] arrTmp = numbers; numbers = new int[oldLength - 1]; Array.Copy(arrTmp, numbers, Token); Array.Copy(arrTmp, r+1, numbers, Token, oldLen

这就是我从值类型数组中删除指定元素的全部方法,但它不起作用

我得到了值类型数组的4个元素。我在里面储存了4个不同的数字

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

我得到了一个随机类来随机选取一个数字,如果它是2,则必须以升序顺序从数组中移除,每个元素都应该被检查和消除

使用

List l=新列表();
l、 增加(2);
l、 增加(4);
...
l、 移除(2);

如果您确实需要使用普通数组,并使用
数组复制其内容。复制
(这在.NET中不是一种常见的处理方式),那么从使用笔开始,然后写下您试图复制的数组部分的正确索引和长度

在知道如何解决之前就开始编写解决方案不会让你走得很远

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

var newArray = numbers.Where(n=> n!= Token).ToArray();
现在,假设
indexToRemove
3
,并尝试手动执行:

  • 第1部分:
    {0,1,2}
    (开始=
    0
    ,长度=
    3
  • 第二部分:
    {4,5,6,7}
    (开始=
    4
    ,长度=
    4
从这个具体示例中,您可以尝试推断这两个阵列部件的偏移量和长度的一般公式:

  • 第1部分:开始=
    0
    ,长度=
    (indexToRemove-1)
  • 第2部分:开始=
    (indexToRemove+1)
    ,长度=
    (array.length-indexToRemove-1)
那么代码本身就是微不足道的:

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

// index to remove 
int indexToRemove = new Random().Next(array.Length);
此外,
Array.Copy
可用于将数组的一部分复制到自身上,这意味着您可以将数组的第二部分向后移动一个位置,然后使用以下命令调整初始数组的大小:

当然,如果您只是使用
列表
,那么您只需使用该方法删除该项:

// 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);
var list=newlist(){0,1,2,3,4,5,6,7,8};
int indexToRemove=new Random().Next(list.Count);
list.removet(indexToRemove);

这是一般的方法:

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

注意到处都使用
r
。此处
r
将是要忽略的元素的索引。

不使用集合的任何原因?数组具有固定长度,因此“调整大小”涉及实际创建一个新数组并复制元素值。您可以使用
Array.Resize(参考号,newLength)来实现这一点
@Jeppe:OP实际上正在创建一个新数组(
numbers
)并从源数组(
arrTmp
)复制到那里。什么是
Token
,什么是
r+1
Token
是原始数组的元素,而
r
是其索引吗?
// starting array
int[] array = { 0, 1, 2, 3, 4, 5, 6, 7 };

// index to remove 
int indexToRemove = new Random().Next(array.Length);
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);
// 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);
var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
int indexToRemove = new Random().Next(list.Count);
list.RemoveAt(indexToRemove);
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);