能否请您说明示例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();
}
}
答案 0 :(得分:4)
在场景1中,您正在处理整个列表,然后通过IEnumerable
接口返回该列表。无论调用者打算如何处理返回的IEnumerable
,每次调用GetObjectsStrings
时,整个列表都会得到处理。
在方案2中,您只能处理input
列表中呼叫者所需的条目。因此,您正在创建一个迭代器。
在下面的例子中,它会有所作为:
var temp = GetObjectsStrings(input).First();
方案1:您每次都为这样的呼叫完全处理input
。
方案2:您只处理input
中的第一项。然后,迭代完成。
答案 1 :(得分:1)
他们做不同的事情,所以肯定会有区别。
第一个是创建一个新列表,其中包含来自现有列表的ToString
版本的项目,然后返回该新列表。
第二个是遍历现有List,并返回ToString
版本,而不进行任何复制。
2是最高效的(就速度和内存使用而言),因为没有新的列表正在生成或复制任何内容。