创建数组与列表
创建数组与列表
这个问题已经有答案了:
在下面的代码中,直接创建List
,而不是创建string[]
并在将其传递给SomeMethod()
之前调用ToList()
,这样做是否更有效(从内存和时间的角度考虑)?
如果创建string[]
并调用ToList()
,是否会创建一个List
对象,同时已经具有string[]
?
我之所以问这个问题是因为我看到过代码,其中他们在将string[]
作为参数传递给具有List
参数的方法之前调用了ToList()
,我不确定是否有任何特别的原因。
class Program { static void Main(string[] args) { var array = new string[] { "str1", "str2" }; SomeMethod(array.ToList()); var list = new List { "str1", "str2" }; SomeMethod(list); } static void SomeMethod(List list) { //do stuff } }
admin 更改状态以发布 2023年5月21日
.ToList()
和.ToArray()
操作会创建新对象、分配内存、复制数值,因此尽量减少此类操作- 使用更常见的类型:IEnumerable和ICollection。因为list和array都适用于IEnumerable,例如:
class Program { static void Main(string[] args) { var array = new string[] { "str1", "str2" }; SomeMethod(array); var list = new List{ "str1", "str2" }; SomeMethod(list); } static void SomeMethod(IEnumerable list) { //do stuff } }
参考。
List的ToArray方法:
public T[] ToArray() { T[] objArray = new T[this._size]; Array.Copy((Array) this._items, 0, (Array) objArray, 0, this._size); return objArray; }
可以看到,它会复制数据。
ToList方法:
public static ListToList (this IEnumerable source) { if (source == null) throw Error.ArgumentNull("source"); return new List (source); }
可以看到,它会创建新的列表对象。并且构造函数 List(IEnumerable
会复制数据。