创建阵列列表

Bac*_*ave 2 c# arrays list

在下面的代码中,是否更有效(在内存和时间方面)List<string>直接创建,而不是在传递给它之前创建string[]和调用ToList()SomeMethod()

如果你创建string[]和调用ToList(),它会创建一个List<string>对象,还有已经拥有string[]

我问的原因是我看到了代码,他们在创建string[]和调用ToList()之前将它作为参数传递给带List<string>参数的方法,我不确定是否有任何特殊原因.

class Program
    {
        static void Main(string[] args)
        {            
            var array = new string[] { "str1", "str2" };
            SomeMethod(array.ToList());
            var list = new List<string> { "str1", "str2" };
            SomeMethod(list);                        
        }

        static void SomeMethod(List<string> list)
        {
            //do stuff
        }
    }
Run Code Online (Sandbox Code Playgroud)

Bac*_*cks 10

  1. 每个.ToList().ToArray()创建新对象,分配内存,复制值.因此,尽量减少此类操作
  2. 使用更常见的类型:IEnumerable,ICollection.因为列表和数组都适用于IEnumerable,例如:

class Program
{
    static void Main(string[] args)
    {            
        var array = new string[] { "str1", "str2" };
        SomeMethod(array);
        var list = new List<string> { "str1", "str2" };
        SomeMethod(list);                        
    }

    static void SomeMethod(IEnumerable<string> list)
    {
        //do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

参考.

ToArray列表方法:

public T[] ToArray()
{
  T[] objArray = new T[this._size];
  Array.Copy((Array) this._items, 0, (Array) objArray, 0, this._size);
  return objArray;
}
Run Code Online (Sandbox Code Playgroud)

你可以看到,它复制数据.

ToList方法:

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
  if (source == null)
    throw Error.ArgumentNull("source");
  return new List<TSource>(source);
}
Run Code Online (Sandbox Code Playgroud)

你可以看到,它创建了新的列表对象.构造函数List(IEnumerable<T> collection)复制数据.