![](/img/trans.png)
[英]Are there any C# collections where modification does not invalidate iterators?
[英]C# Performance with collections and iterators
您能否解释示例1中采用的方法与示例2中的方法在性能上是否有所不同? 如果是,哪个是最有效的,为什么?
我所说的“性能”不仅与执行速度有关。 我还想对有关不同系统资源使用情况进行一些解释。
1。
private IEnumerable<string> GetObjectsStrings(List<object> input)
{
IList<string> result = new List<string>();
foreach (var item in input)
{
result.Add(item.ToString());
}
return result;
}
2。
private IEnumerable<string> GetObjectsStrings(List<object> input)
{
foreach (var item in input)
{
yield return item.ToString();
}
}
在方案1中,您要处理整个列表,然后通过IEnumerable
接口返回该列表。 无论调用者打算如何处理返回的IEnumerable
,每次调用GetObjectsStrings
都会处理整个列表。
在方案2中,仅处理input
列表中调用者所需的条目。 因此,您正在创建一个迭代器。
这是一个可以发挥作用的示例:
var temp = GetObjectsStrings(input).First();
方案1:您每次都完全为每个此类调用处理input
。 方案2:您只处理input
中的第一项。 然后,迭代完成。
他们做不同的事情,所以肯定会有区别。
第一个是创建一个新列表,其中包含现有列表中项目的ToString
版本,然后返回该新列表。
第二个是迭代现有List,并返回ToString
版本,而不进行任何复制。
2是最有效的(就速度和内存使用而言),因为没有新的列表正在生成或复制任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.