为了账号安全,请及时绑定邮箱和手机立即绑定

集合和迭代器的 C# 性能

集合和迭代器的 C# 性能

C#
慕婉清6462132 2022-11-21 21:25:19

您能否解释一下示例 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 回答

?
慕田峪9158850

TA贡献1509条经验 获得超1个赞

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

在场景 2 中,您只处理input调用者所需的列表中的条目。所以,你正在创建一个迭代器。

这是一个会有所作为的示例:

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

场景 1:您input每次都对每个此类调用进行完整处理。场景 2:您只处理 中的第一项input。然后,迭代完成。


查看完整回答
反对 回复 2022-11-21
?
梦里花落0921

TA贡献1498条经验 获得超5个赞

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

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

第二个是遍历现有列表,并返回ToString版本,而不制作任何副本。

2 是最有效的(在速度和内存使用方面),因为没有新列表正在制作或任何东西的副本。


查看完整回答
反对 回复 2022-11-21
  • 2 回答
  • 0 关注
  • 7 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信