C# 什么是c中的IEnumerable接口?如果我们不用呢?

C# 什么是c中的IEnumerable接口?如果我们不用呢?,c#,ienumerable,C#,Ienumerable,在internet上搜索C中的IEnumerable接口是什么?它解决了什么问题?如果我们不用呢?但从来没有真正得到多少。许多帖子解释了如何实现它 我还发现了以下示例 List<string> List = new List<string>(); List.Add("Sourav"); List.Add("Ram"); List.Add("Sachin");

在internet上搜索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);
        }
上述ex输出:

苏拉夫

萨钦

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

如果你们中有人能帮助我理解这一点,我将不胜感激。使用IEnumerable举例说明有什么好处?如果我们不使用它怎么办?

除了阅读I'd description IEnumerable作为t的集合外,它还可以被迭代,并且可以执行许多其他函数,例如Where、Any和Count,但是它不是为添加和删除元素而设计的。那是一张单子

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

列表、数组、包、队列和堆栈的许多具体实现都实现了它,允许各种集合使用它的扩展方法

此外,实现IEnumerable或IEnumerable的集合也可以在foreach循环中使用

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

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

TLDR

它是许多不同类型集合的公共基本接口,允许您在foreach循环中使用集合,并免费提供许多额外的扩展方法

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

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

IEnumerable和更受欢迎的IEnumerable是处理“元素序列”模式的标准方法

每个类型的想法是:IEnumerable看起来像是有一个标签:EnumerateMe。不管有什么:订单项队列、控件集合、sql查询记录、xml元素子节点等等——从enumerable的角度看都是一样的:您有一个序列,可以从序列中为每个项做一些事情

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


这个问题被问了很多次,下面是一些答案:,

这也是让您的收藏在foreach循环中可用的一种方法。这不是唯一的方法。使用IEnumerable有什么好处?只需搜索在OOP中使用接口的好处。@Aron我确信还有另一个。。。也许我在考虑通用/非通用版本。我已经改为最普通的,直到我可以备份它!如果我们不用呢?即使你不知道自己在使用IEnumerable,也很难在.NET中不使用它@实际上,Aron,.IEnumerable name=。。。表示您对序列中项目的确切类型不感兴趣。什么都可以。所以,您可以在names中编写foreach int name,它将编译,但肯定会在运行时失败。您可以显式声明类型:IEnumerable names=。。。或者,您可以允许编译器为您推断:var names=。。。