改变数组大小
声明后是否可以更改数组大小?
如果没有,是否有数组的替代方案?
我不想创建一个大小为 1000 的数组,但在创建数组时我不知道数组的大小。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
声明后是否可以更改数组大小?
如果没有,是否有数组的替代方案?
我不想创建一个大小为 1000 的数组,但在创建数组时我不知道数组的大小。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(18)
您可以使用
Array.Resize()
,记录在 MSDN 中。但是,是的,我同意 Corey 的观点,如果您需要动态大小的数据结构,我们有
List
。重要提示:
Array.Resize()
不会调整数组大小(方法名称具有误导性),它会创建一个新数组并且仅替换您传递给该方法的引用。一个例子:
You can use
Array.Resize()
, documented in MSDN.But yeah, I agree with Corey, if you need a dynamically sized data structure, we have
List
s for that.Important:
Array.Resize()
doesn't resize the array (the method name is misleading), it creates a new array and only replaces the reference you passed to the method.An example:
不,请尝试使用强类型列表。
例如:
您可以这样做,而不是使用
:
列表使用数组来存储数据,这样您就可以通过添加和删除项目而无需担心
LinkedList
的便利性,从而获得数组的速度优势。必须手动更改其大小。但这并不意味着数组的大小(在本例中为
List
)不会改变 - 因此强调手动这个词。一旦数组达到预定义的大小,JIT 就会在堆上分配一个两倍大小的新数组,并复制现有数组。
No, try using a strongly typed List instead.
For example:
Instead of using
You could do this:
Lists use arrays to store the data so you get the speed benefit of arrays with the convenience of a
LinkedList
by being able to add and remove items without worrying about having to manually change its size.This doesn't mean an array's size (in this instance, a
List
) isn't changed though - hence the emphasis on the word manually.As soon as your array hits its predefined size, the JIT will allocate a new array on the heap that is twice the size and copy your existing array across.
是的,可以调整数组的大小。例如:
如果使用 CreateInstance() 方法创建数组,则 Resize() 方法不起作用。例如:
数组大小不是动态的,即使我们可以调整它的大小。如果你想要一个动态数组,我想我们可以使用通用List来代替。
Yes, it is possible to resize an array. For example:
If you create an array with CreateInstance() method, the Resize() method is not working. For example:
The array size is not dynamic, even we can resize it. If you want a dynamic array, I think we can use generic List instead.
您可以在 .net 3.5 及更高版本中使用 Array.Resize() 。该方法分配一个指定大小的新数组,将旧数组中的元素复制到新数组,然后用新数组替换旧数组。
(因此您将需要两个数组可用的内存,因为这可能在幕后使用 Array.Copy )
You can use
Array.Resize()
in .net 3.5 and higher. This method allocates a new array with the specified size, copies elements from the old array to the new one, and then replaces the old array with the new one.(So you will need the memory available for both arrays as this probably uses
Array.Copy
under the covers)在 C# 中,数组不能动态调整大小。
一种方法是使用
System.Collections.ArrayList
原生数组
。另一个(更快)的解决方案是
重新分配数组
不同的尺寸并复制
将旧数组的内容复制到新数组中
数组。
通用函数
resizeArray
(如下)可用于执行此操作。In C#, arrays cannot be resized dynamically.
One approach is to use
System.Collections.ArrayList
insteadof a
native array
.Another (faster) solution is to
re-allocate the array with a
different size and to copy the
contents of the old array to the new
array.
The generic function
resizeArray
(below) can be used to do that.使用 System.Collections.Generic.List
Use System.Collections.Generic.List
请改用
List
。 而不是整数数组使用
例如,稍后
Use a
List<T>
instead. For instance, instead of an array of intsuse
later
对于字节数组使用此方法:
最初:
每当需要时(需要提供原始长度以进行扩展):
重置:
类型化列表方法
最初:
每当需要时:
释放/清除:
Used this approach for array of bytes:
Initially:
Whenever required (Need to provide original length for extending):
Reset:
Typed List Method
Initially:
Whenever required:
Release/Clear:
在 C# 中,
Array.Resize
是将任何数组大小调整为新大小的最简单方法,例如:这里,我想调整 LinkButton 数组的数组大小:
= 指定数组类型ref area
= ref 是关键字,'area' 是数组名称size
= 新的大小数组In C#,
Array.Resize
is the simplest method to resize any array to new size, e.g.:Here, i want to resize the array size of LinkButton array:
<LinkButton>
= specifies the array typeref area
= ref is a keyword and 'area' is the array namesize
= new size array如果您确实需要将其恢复为数组,我发现最简单的方法是将数组转换为列表,展开列表,然后将其转换回数组。
If you really need to get it back into an array I find it easiest to convert the
array
to alist
, expand the list then convert it back to anarray
.当您想要添加/删除数据时,请使用列表(其中 T 是任何类型或对象),因为调整数组大小的成本很高。您可以阅读有关被认为有些有害的数组的更多信息 而列表可以添加到新记录可以追加到末尾。它根据需要调整其大小。
可以使用集合初始值设定项通过以下方式初始化列表
。
将 var 关键字与集合初始值设定项一起使用。
使用新数组作为参数。
在构造函数和赋值中使用容量。
对每个元素使用 Add 方法。
因此,对于对象列表,您可以与列表初始化内联地分配和指定对象的属性。对象初始值设定项和集合初始值设定项共享相似的语法。
使用集合初始值设定项初始化列表。
使用新对象初始化列表。
Use a List (where T is any type or Object) when you want to add/remove data, since resizing arrays is expensive. You can read more about Arrays considered somewhat harmful whereas a List can be added to New records can be appended to the end. It adjusts its size as needed.
A List can be initalized in following ways
Using collection initializer.
Using var keyword with collection initializer.
Using new array as parameter.
Using capacity in constructor and assign.
Using Add method for each element.
Thus for an Object List you can allocate and assign the properties of objects inline with the List initialization. Object initializers and collection initializers share similar syntax.
Initialize list with collection initializer.
Initialize list with new objects.
这对我从类数组创建动态数组很有效。
This worked well for me to create a dynamic array from a class array.
使用通用列表 (System.Collections.Generic.List)。
Use a generic List (System.Collections.Generic.List).
如果您无法使用 Array.Reset(变量不是本地变量),则使用 Concat &
ToArray
帮助:In case you cannot use
Array.Reset
(the variable is not local) thenConcat
&ToArray
helps:我正在寻找一种使用 while 循环在简单的猜谜游戏中增加数组长度的方法。该数组的长度初始化为 1。我使用“i”(初始化为 0)来记录当前循环中的猜测次数。第 2 行显示数组中的最低分数。在增加下一轮的数组位置后,我使用 Array.Resize() 将数组的长度扩展了 i + 1。这样,数组长度随着循环的每次迭代而扩展。
I was looking for a way to increment the length of my array in a simple guessing game using while loops. The array was initialised with a length of 1. I used 'i' (initialised at 0) to record the number of guesses in the current round of the loop. Line 2 displays the lowest score in the array. After incrementing the array position for the next round, I used Array.Resize() to extend the length of the array by i + 1. This way, the array length extends with each iteration of the loop.
我将给出一个非常不同的答案。是的,你不需要列表或 Array.Resize!示例:
您的类方法可以更新数组大小,没问题。在上面的代码中相应地替换类名和方法名以及参数。
I'm going to give a very different answer. Yes and you don't need lists or Array.Resize!! Example:
your class methods can update the array size, no problem. In the code above replace the class name and method name and arguments accordingly.