创建数组与列表

15 浏览
0 Comments

创建数组与列表

这个问题已经有答案了:

数组与列表:何时使用哪种?

在下面的代码中,直接创建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日
0
0 Comments

我认为直接使用List会更加高效,但时间取决于内部处理。不过,ToList可能会创建一个列表,然后从数组中移动数据,这在时间上似乎也很低效。

尝试运行一些测试,每个方法运行大约100000次,并查看每个测试所需的时间。

0
0 Comments
  1. .ToList().ToArray() 操作会创建新对象、分配内存、复制数值,因此尽量减少此类操作
  2. 使用更常见的类型: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 List ToList(this IEnumerable source)
{
  if (source == null)
    throw Error.ArgumentNull("source");
  return new List(source);
}

可以看到,它会创建新的列表对象。并且构造函数 List(IEnumerable collection) 会复制数据。

0