3

我有一个具有多个值的 int 数组。我必须向该数组添加一个元素。我会这样解决它:

int[] myIntArray=SomeMagicThere();

List<int> intList= myIntArray.ToList();
intList.Add(88);
myIntArray= intList.ToArray();

(这很简单,我不能改变 myIntArray 的类型是有充分理由的)

你会用另一种方式解决它吗?做两次演员表感觉有点“脏”

4

4 回答 4

9

规范的方式是

Array.Resize(ref myIntArray, myIntArray.Length + 1);
myIntArray[myIntArray.Length - 1] = 88;

一个 LINQ 版本,它不会像您的那样执行那么多的数组副本

myIntArray = myIntArray.Concat(new[] { 88 }).ToArray();

编辑:这个 LINQ 版本实际上比你原来的慢!LINQ 数组到列表和列表到数组针对直接数组副本进行了优化,而这Concat意味着 LINQ 不再知道序列有多长,因此会在达到内部缓冲区的容量时导致多次调整数组大小和复制。

(我假设您必须使用数组,因为您似乎已经熟悉列表。)

于 2013-06-07T09:03:11.050 回答
2

你会用另一种方式解决它吗?

我会改变SomeMagicThere(当然,如果可能的话):

public List<int> SomeMagicThere()
{
   // ...
}

不应该有任何性能滞后,因为内部List<T>使用数组来存储其项目。事实上,它会为你调整数组大小,我看不出有任何理由编写相同的代码,List<T>已经有。

于 2013-06-07T09:04:20.103 回答
0

违规行是第一行:

int[] myIntArray=SomeMagicThere();

改成:

List<int> magicInts = new List<int>(SomeMagicThere());

然后您可以轻松调用:

magicInts.Add(88);

构造List<T>(IEnumerable<T>)函数会将输入复制到自身中,允许您轻松添加和删除项目,而无需自己修改数组。

于 2013-06-07T09:09:02.760 回答
0

你基本上有两个选择:

  1. 如果您经常更改大小 - 考虑使用 List<int> 而不是 Array。
  2. 使用 Array.Resize 静态方法。

数组可以通过索引快速访问元素,而 List<> 可以快速添加/删除元素。

于 2013-06-07T09:06:02.657 回答