更优雅的方式来增加一个int-array?

时间:2013-06-07 09:00:49

标签: c# arrays list

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

int[] myIntArray=SomeMagicThere();

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

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

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

4 个答案:

答案 0 :(得分:9)

规范的方式是

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

一个LINQ版本,其执行的阵列副本数量不会超过你的

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

编辑:这个LINQ版本实际上比原版慢! LINQ数组到列表和列表到数组被优化为直接数组副本,而Concat意味着LINQ不再知道序列有多长,因此导致多个数组调整大小并复制为内部缓冲区能力已达到。

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

答案 1 :(得分:2)

  

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

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

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

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

答案 2 :(得分:0)

您基本上有两个选择:

  1. 如果您经常更改大小 - 请考虑使用List&lt; INT&GT;而不是数组。
  2. 使用Array.Resize静态方法。
  3. 通过索引访问元素的数组很快,而List&lt;&gt;添加/删除元素很快。

答案 3 :(得分:0)

违规行是第一行:

int[] myIntArray=SomeMagicThere();

更改为:

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

然后你可以轻松打电话:

magicInts.Add(88);

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