集合和迭代器的C#性能

时间:2019-04-01 12:27:23

标签: c# .net performance oop iterator

能否请您说明示例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();
        }
    }

2 个答案:

答案 0 :(得分:4)

在场景1中,您正在处理整个列表,然后通过IEnumerable接口返回该列表。无论调用者打算如何处理返回的IEnumerable,每次调用GetObjectsStrings时,整个列表都会得到处理。

在方案2中,您只能处理input列表中呼叫者所需的条目。因此,您正在创建一个迭代器。

在下面的例子中,它会有所作为:

var temp = GetObjectsStrings(input).First();

方案1:您每次都为这样的呼叫完全处理input。 方案2:您只处理input中的第一项。然后,迭代完成。

答案 1 :(得分:1)

他们做不同的事情,所以肯定会有区别。

第一个是创建一个新列表,其中包含来自现有列表的ToString版本的项目,然后返回该新列表。

第二个是遍历现有List,并返回ToString版本,而不进行任何复制。

2是最高效的(就速度和内存使用而言),因为没有新的列表正在生成或复制任何内容。