【问题标题】:What is IEnumerable interface in c#? What if we dont use it?c#中的IEnumerable接口是什么?如果我们不使用它怎么办?
【发布时间】:2014-12-19 08:04:36
【问题描述】:

在互联网上搜索 C# 中的 IEnumerable 接口是什么?它解决的问题?如果我们不使用它怎么办?但从来没有真正得到多少。很多帖子解释了如何实现它。

我还找到了以下示例

List<string> List = new List<string>();
        List.Add("Sourav");
        List.Add("Ram");
        List.Add("Sachin");

       
        IEnumerable names = from n in List where (n.StartsWith("S")) select n;
        // var names = from n in List where (n.StartsWith("S")) select n;

        foreach (string name in names)
        {
            Console.WriteLine(name);
        }

上述前输出:

苏拉夫

萨钦

我想知道,在上面的例子中使用 IEnumerable 的好处是什么?我可以使用“var”(注释行)来实现同样的效果。

如果你们中的任何人能帮助我理解这一点以及使用 IEnumerable 和示例有什么好处,我将不胜感激?如果我们不使用它怎么办?

【问题讨论】:

  • IEnumerable names = ... 表示您对序列中项目的确切类型不感兴趣。任何事情都会足够好。所以,你可以写foreach (int name in names),它会编译(但在运行时肯定会失败)。您可以显式声明类型:IEnumerable&lt;string&gt; names = ...,也可以允许编译器为您推断:var names = ...

标签: c# ienumerable


【解决方案1】:

除了阅读documentation,我将IEnumerable&lt;T&gt;描述为Ts的集合,可以迭代并且可以执行许多其他功能(例如Where()、Any () 和 Count()) 但是它不是为添加和删除元素而设计的。那是List&lt;T&gt;

它很有用,因为它是许多集合的基本接口,各种数据访问层和 ORM 都使用它,并且自动包含许多扩展方法。

Lists、Arrays、Bags、Queues、Stacks 的许多具体实现都实现了它,允许各种集合使用它的扩展方法。

还可以在 foreach 循环中使用实现 IEnumerable 或 IEnumerable 的集合。

来自msdn

对于数组或对象集合中的每个元素,实现 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable 接口。

在您的代码示例中,您有一个名为 names 的变量,它将是一个 IEnumerable&lt;string&gt;,重要的是要了解它是一个 IEnumerable&lt;string&gt;,无论您是否使用 var 关键字。 var 只是允许您避免每次都如此明确地编写类型。

TLDR

它是许多不同类型集合的通用基础接口,可让您在 foreach 循环中使用您的集合,并免费提供许多额外的扩展方法。

【讨论】:

  • “这也是让你的集合在 foreach 循环中可用的一种方式”不是唯一的方式。
  • 使用 IEnumerable 有什么好处?只需搜索在 OOP 中使用接口的好处。
  • @Aron 我确定还有另一个......也许我正在考虑通用/非通用版本。在我可以备份之前,我已更改为“最常见”!
  • 如果我们不使用它怎么办?即使您不知道自己在使用 IEnumerable,在 .NET 中也很难不使用它。 ;)
  • @Aron,实际上,it is not
【解决方案2】:

IEnumerable 和更受欢迎的IEnumerable&lt;T&gt; 是处理“元素序列”模式的标准方法。

这个想法是每个类型: IEnumerable&lt;T&gt; 看起来像如果有一个标签:“ENUMERATE ME”。不管那里有什么:订单项队列、控件集合、来自 sql 查询的记录、xml 元素子节点等等等 - 从可枚举的角度来看都是一样的:你有一个序列,你可以为每个序列做一些事情序列中的项目。

请注意,IEnumerable 有一定的局限性:没有计数,没有索引访问,无法保证可重复的结果,无法检查 enumerable 是否为空,只能获取枚举器并检查是否有任何内容。简单性允许涵盖几乎所有用例,从集合到临时序列(自定义迭代器、linq 查询等)。

这个问题被问了多次,这里有一些答案:123

【讨论】:

    【解决方案3】:

    MSDN

    省略 IEnumerable 和 IEnumerator 的缺点是集合类不再与 其他公共语言运行时语言的 foreach 语句或等效语句互操作。 "

    因此您需要实现此接口,以便您的自定义集合类型可以与其他 CLR 语言一起使用。这似乎是 CLS 要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      • 2022-01-07
      相关资源
      最近更新 更多