优雅的增加整型数组的方法?

3

我有一个包含多个值的整数数组。我需要向该数组添加一个元素。我会采用以下方式解决:

int[] myIntArray=SomeMagicThere();

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

这只是一个简化的例子,我不能改变myIntArray的类型有很好的原因。

您能用另一种方式解决它吗?两次强制转换感觉有点“不好”。


1
首先,为什么需要将它存储在数组中? - Arran
1
为什么不首先使用List<int>?它一定非得是数组吗? - Mithrandir
正如我所写的: 这只是一个简化的示例。 我正在访问从实体框架创建的现有对象结构。 为此目的更改它不是一个好主意 :) - Ole Albers
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不再知道序列的长度,因此当内部缓冲区的容量达到时,会导致多次数组重新调整大小和复制。

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


1
我非常喜欢LINQ方法,即使只是因为它看起来更好:)。谢谢 - Ole Albers
1
@Ole 只是让你知道,LINQ 版本比 Array 版本慢大约十倍。事实上,它比你的原始版本还要慢,现在我必须找出原因。可能是因为 LINQ 列表转数组和数组转列表具有一些不错的优化,而 Concat 则需要设置一个真正缓慢的迭代器循环。 - Rawling

2

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

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

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

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


0

问题所在的行是第一行:

int[] myIntArray=SomeMagicThere();

更改为:

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

然后你可以轻松调用:

magicInts.Add(88);

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


0

你基本上有两个选择:

  1. 如果你经常更改大小 - 考虑使用List< int>代替数组。
  2. 使用Array.Resize静态方法。

对于通过索引访问元素,数组很快,而对于添加/删除元素,List<>很快。


我非常确定,当涉及按索引访问时,List 的速度是一样快的。 - Nikita B
不如数组快。https://dev59.com/NHRB5IYBdhLWcg3w9L3n - ElmoVanKielmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接