我有一个包含多个值的int数组。我必须向该数组添加一个元素。我会这样解决:
int[] myIntArray=SomeMagicThere();
List<int> intList= myIntArray.ToList();
intList.Add(88);
myIntArray= intList.ToArray();
(这很简单,我有理由不能改变myIntArray的类型)
你会以另一种方式解决它吗?做两个演员感觉有点“脏”
答案 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)
您基本上有两个选择:
通过索引访问元素的数组很快,而List&lt;&gt;添加/删除元素很快。
答案 3 :(得分:0)
违规行是第一行:
int[] myIntArray=SomeMagicThere();
更改为:
List<int> magicInts = new List<int>(SomeMagicThere());
然后你可以轻松打电话:
magicInts.Add(88);
List<T>(IEnumerable<T>)
constructor会将输入复制到自身,让您轻松添加和删除项目,而无需自己修改数组。