【问题标题】:Creating an Array Vs List [duplicate]创建数组与列表 [重复]
【发布时间】:2015-11-19 23:21:55
【问题描述】:

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

如果您创建string[] 并调用ToList(),它是否会创建一个List<string> 对象,以及已经拥有string[]

我问的原因是我已经看到他们创建string[] 并在将其作为参数传递给带有List<string> 参数的方法之前调用ToList() 的代码,我不确定是否存在有什么特别的原因。

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
        }
    }

【问题讨论】:

  • 你说的是时间效率还是内存效率?
  • 我对时间和内存效率都很感兴趣。
  • 肯定会创建一个 string[] 并调用 ToList() 会在时间和内存效率方面有所损失吗?我无法弄清楚为什么在生产中使用此代码。它是由一位经验丰富的开发人员编写的。
  • 即使是最有经验的开发人员也有休息日:)
  • 有些方法可以修改参数,即使不应该这样做......也许那个人只是在代码库中工作,其中方法名称始终如一地谎报他们所做的事情(比如CountItemsInList(list)实际上可能会删除一半的项目... :) )

标签: c# arrays list


【解决方案1】:
  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<string> { "str1", "str2" };
        SomeMethod(list);                        
    }

    static void SomeMethod(IEnumerable<string> 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<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
  if (source == null)
    throw Error.ArgumentNull("source");
  return new List<TSource>(source);
}

你可以看到,它创建了新的列表对象。并且构造函数List(IEnumerable&lt;T&gt; collection)复制数据。

【讨论】:

    【解决方案2】:

    我希望直接访问List 的内存效率更高,但时间取决于内部工作情况。 ToList 可能包括创建一个列表,然后将数据从数组中移出,然而,这在时间方面似乎也效率低下。

    尝试对每个方法运行 100000 次左右的测试,然后查看每次测试所花费的时间。

    【讨论】:

    • 1000 对于这种数据大小可能是不够的。试试几十万。
    • 这取决于计算机的速度有多慢。测试哪个测试效果好...
    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2015-10-16
    • 2012-02-03
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多