我有一个包含多个值的整数数组。我需要向该数组添加一个元素。我会采用以下方式解决:
int[] myIntArray=SomeMagicThere();
List<int> intList= myIntArray.ToList();
intList.Add(88);
myIntArray= intList.ToArray();
这只是一个简化的例子,我不能改变myIntArray的类型有很好的原因。
您能用另一种方式解决它吗?两次强制转换感觉有点“不好”。
我有一个包含多个值的整数数组。我需要向该数组添加一个元素。我会采用以下方式解决:
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;
myIntArray = myIntArray.Concat(new[] { 88 }).ToArray();
编辑:这个LINQ版本实际上比你原来的版本更慢!LINQ数组转列表和列表转数组被优化为直接复制数组,而Concat
意味着LINQ不再知道序列的长度,因此当内部缓冲区的容量达到时,会导致多次数组重新调整大小和复制。
(我假设你必须使用数组,因为你似乎已经熟悉列表了。)
Array
版本慢大约十倍。事实上,它比你的原始版本还要慢,现在我必须找出原因。可能是因为 LINQ 列表转数组和数组转列表具有一些不错的优化,而 Concat
则需要设置一个真正缓慢的迭代器循环。 - Rawling你能用另一种方式解决它吗?
我会改变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<>很快。