什么是c#中的IEnumerable接口?如果我们不使用它怎么办?

时间:2014-12-19 08:04:37

标签: c# ienumerable

在互联网上搜索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);
        }

上述输出:

  

Sourav

     

萨钦

我想知道,在上面的例子中使用IEnumerable的优势是什么?我可以使用'var'(注释行)来实现相同的目的。

如果你们中的任何人能够帮助我理解这一点并且使用IEnumerable的例子有什么好处,我将不胜感激?如果我们不使用它会怎么样?

3 个答案:

答案 0 :(得分:6)

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

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

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

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

来自msdn

  

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

在您的代码示例中,您有一个名为name IEnumerable<string>的变量,了解它是IEnumerable<string>非常重要,无论您是否使用var关键字与否。 var只允许您每次都明确地避免写入类型。

<强> TLDR

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

答案 1 :(得分:1)

IEnumerable以及更优选的IEnumerable<T>是处理元素序列的标准方法。图案。

这个想法是每种类型: IEnumerable<T>看起来像是否有标签:&#34; ENUMERATE ME&#34;。无论那里有什么:订单项目队列,控件集合,sql查询记录,xml元素子节点等等 - 从可枚举的角度来看都是一样的:你和#39;有一个序列,你可以为序列中的每个项目做一些事情。

请注意IEnumerable有些限制:没有计数,没有索引访问,无法保证可重复的结果,无法检查枚举是否为空但是要获取枚举数并检查是否存在什么都没有。简单性允许涵盖几乎所有用例,从集合到临时序列(自定义迭代器,linq查询等)。

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

答案 2 :(得分:0)

MSDN

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

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