.NET为什么现有List上的IEnumerable.ToList()创建新数组

Kla*_*Nji 7 ienumerable extension-methods

出于好奇,为什么在现有List上调用IEnumerable.ToList()不返回相同的实例?同样适用于IEnuerable.ToArray().从内存消耗的角度来看,这会不会更好?

我运行了以下快速测试:

  var things= new List<Thing>( new [] {new Thing(), new Thing()});
        Console.WriteLine(things.GetHashCode());

        things= things.ToList();
        Console.WriteLine(things.GetHashCode());
Run Code Online (Sandbox Code Playgroud)

我得到了不同的对象实例.为什么不是简单的相同实例?

Fyo*_*kin 9

这是故意这样做以启用"复制列表"方案.

例如,我这样做foreach( var a in list ) list.Remove(a),我将得到一个例外,说明在枚举进行过程中"集合已被修改".

为了解决这个问题,我做了:foreach( var a in list.ToList() ) list.Remove(a).

如果你想要"转换为列表,如果它不是一个已经"的语义,你将不得不自己处理它.实际上,你实际上可以为此编写一个简洁的扩展方法:

public static IList<T> ToListIfNotAlready( this IEnumerable<T> source )
{
     var list = source as IList<T>;
     return list == null ? source.ToList() : list;
}
Run Code Online (Sandbox Code Playgroud)

是的,它可能是另一种方式,但LINQ设计师选择了这种方法,并且完全有权这样做,因为在一般情况下这两种方法都没有明显的优势.