我有一个具有多个值的 int 数组。我必须向该数组添加一个元素。我会这样解决它:
int[] myIntArray=SomeMagicThere();
List<int> intList= myIntArray.ToList();
intList.Add(88);
myIntArray= intList.ToArray();
(这很简单,我不能改变 myIntArray 的类型是有充分理由的)
你会用另一种方式解决它吗?做两次演员表感觉有点“脏”
规范的方式是
Array.Resize(ref myIntArray, myIntArray.Length + 1);
myIntArray[myIntArray.Length - 1] = 88;
一个 LINQ 版本,它不会像您的那样执行那么多的数组副本
myIntArray = myIntArray.Concat(new[] { 88 }).ToArray();
编辑:这个 LINQ 版本实际上比你原来的慢!LINQ 数组到列表和列表到数组针对直接数组副本进行了优化,而这Concat
意味着 LINQ 不再知道序列有多长,因此会在达到内部缓冲区的容量时导致多次调整数组大小和复制。
(我假设您必须使用数组,因为您似乎已经熟悉列表。)
你会用另一种方式解决它吗?
我会改变SomeMagicThere
(当然,如果可能的话):
public List<int> SomeMagicThere()
{
// ...
}
不应该有任何性能滞后,因为内部List<T>
使用数组来存储其项目。事实上,它会为你调整数组大小,我看不出有任何理由编写相同的代码,List<T>
已经有。
违规行是第一行:
int[] myIntArray=SomeMagicThere();
改成:
List<int> magicInts = new List<int>(SomeMagicThere());
然后您可以轻松调用:
magicInts.Add(88);
构造List<T>(IEnumerable<T>)
函数会将输入复制到自身中,允许您轻松添加和删除项目,而无需自己修改数组。
你基本上有两个选择:
数组可以通过索引快速访问元素,而 List<> 可以快速添加/删除元素。