【问题标题】:If I have a List<T>, is there any advantage of using an IEnumerable<T> when looping through the list?如果我有一个 List<T>,那么在遍历列表时使用 IEnumerable<T> 有什么好处吗?
【发布时间】:2015-07-23 03:54:31
【问题描述】:

在 C# 中,如果我有一个 List&lt;T&gt;,它存储在一个对象中,并且我想检查一个值是否存在于列表中,那么调用返回 IEnumerable&lt;T&gt; 的函数有什么好处,而不是循环浏览我已经拥有的List&lt;T&gt;

谢谢。

【问题讨论】:

  • 如果要检查值是否存在,为什么要调用返回 IEnumerable 的函数?听起来你应该调用 Contains() ,它返回一个布尔值。
  • 这个另一个函数返回的是什么IEnumerable,获取另一个IEnumerable与在列表中查找值有什么关系?
  • 在没有任何代码示例的情况下很难分辨。 :-/。主要区别在于 IEnumerable 是只读的,而 IList 不是。但在你的情况下,这无关紧要。
  • 我觉得他们是一样的
  • 请编辑您的问题以包含说明您所询问的功能的代码示例。

标签: c# list ienumerable


【解决方案1】:

当您将属性返回为IEnumerable&lt;T&gt; 时,这告诉调用者您不能改变它的值,您可以对其进行迭代,这可以帮助您摆脱许多意外错误。

如果您将属性公开为List&lt;T&gt;,它很容易被“其他人”改变,这可能会在大型系统中造成混乱,因此请尽可能保持数据不可变。

您正在跟踪错误,因为列表中的项目不正确,如果该属性公开为 List,您必须查看该属性的所有用法以查看是谁更改了它,但如果您公开了它作为 Iemumerable,您可以确定唯一可以更改它的地方是它自己的对象,这将为您节省大量时间来跟踪错误。

【讨论】:

    【解决方案2】:

    您有一个正在描述的读取操作。以IEnumerable&lt;T&gt; 的形式返回您的IList&lt;T&gt;

    然后,使用 linq 的 Contains() - 它在内部检查 ICollection 的实现并优化使用可用的实现,尽管它接受 IEnumerable&lt;T&gt;。换句话说,返回IEnumerable&lt;T&gt; 不会造成任何损失。

    【讨论】:

      【解决方案3】:

      List 是一个可变集合 - 您可以添加、删除和排序等。它很灵活,但 IEnumerable 允许您使用相同的代码来处理从方法返回的数组、链表、列表、迭代器的任何实现使用 yield 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        相关资源
        最近更新 更多