gpt4 book ai didi

extension-methods - .NET 为什么现有列表上的 IEnumerable.ToList() 创建新数组

转载 作者:行者123 更新时间:2023-12-04 11:13:34 25 4
gpt4 key购买 nike

只是出于好奇,为什么在现有列表上调用 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());

我得到不同的对象实例。为什么不简单地使用相同的实例?

最佳答案

这样做是为了启用“复制列表”方案。

例如,我做 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;
}

是的,也可以相反,但 LINQ 设计者选择了这种方法,并且完全有权这样做,因为在一般情况下,这两种方法都没有明显的优势。

关于extension-methods - .NET 为什么现有列表上的 IEnumerable.ToList() 创建新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8303670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com