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)
我得到了不同的对象实例.为什么不是简单的相同实例?
这是故意这样做以启用"复制列表"方案.
例如,我这样做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设计师选择了这种方法,并且完全有权这样做,因为在一般情况下这两种方法都没有明显的优势.
| 归档时间: |
|
| 查看次数: |
1296 次 |
| 最近记录: |