在.net中什么是IEnumerable

在.net中什么是IEnumerable,.net,ienumerable,.net,Ienumerable,在.net中什么是IEnumerable?首先,它是一个接口。根据的定义是 公开枚举器,该枚举器支持 非泛型问题上的简单迭代 收藏 用一种非常简单的方式说,任何实现此接口的对象都将提供获取枚举数的方法。枚举数与foreach一起使用,作为一个示例 列表实现IEnumerable接口 // This is a collection that eventually we will use an Enumertor to loop through // rather than a ty

在.net中什么是IEnumerable?

首先,它是一个接口。根据的定义是

公开枚举器,该枚举器支持 非泛型问题上的简单迭代 收藏

用一种非常简单的方式说,任何实现此接口的对象都将提供获取枚举数的方法。枚举数与
foreach
一起使用,作为一个示例

列表实现IEnumerable接口

    // This is a collection that eventually we will use an Enumertor to loop through
    // rather than a typical index number if we used a for loop.
    List<string> dinosaurs = new List<string>();

    dinosaurs.Add("Tyrannosaurus");
    dinosaurs.Add("Amargasaurus");
    dinosaurs.Add("Mamenchisaurus");
    dinosaurs.Add("Deinonychus");
    dinosaurs.Add("Compsognathus");

    Console.WriteLine();

    // HERE is where the Enumerator is gotten from the List<string> object
    foreach(string dinosaur in dinosaurs)
    {
        Console.WriteLine(dinosaur);
    }

    // You could do a 
    for(int i = 0; i < dinosaurs.Count; i++)
    {
        string dinosaur = dinosaurs[i];

        Console.WriteLine(dinosaur);
    }
//这是一个集合,我们最终将使用枚举器循环遍历它
//而不是使用for循环的典型索引号。
列出恐龙=新列表();
恐龙。添加(“暴龙”);
恐龙。添加(“Amargasaurus”);
恐龙。添加(“马门基龙”);
恐龙。添加(“Deinonychus”);
恐龙。添加(“Compsognatus”);
Console.WriteLine();
//这里是从列表对象获取枚举数的地方
foreach(恐龙中的字符串恐龙)
{
控制台。书写线(恐龙);
}
//你可以做一个
for(int i=0;i<恐龙数;i++)
{
弦恐龙=恐龙[i];
控制台。书写线(恐龙);
}

foreach看起来更干净。

它是一个由.NET中的集合类型实现的接口,提供了。还有一个通用版本是
IEnumerable

在实现IEnumerable的集合中移动的语法(您很少看到,因为有更漂亮的方法可以做到这一点)是:

IEnumerator enumerator = collection.GetEnumerator();

while(enumerator.MoveNext())
{
    object obj = enumerator.Current;
    // work with the object
}
其功能等同于:

foreach(object obj in collection)
{
    // work with the object
}

如果集合支持索引器,您也可以使用经典的for-loop方法对其进行迭代,但迭代器模式提供了一些很好的附加功能,例如为线程添加同步功能。

简单的回答是,它是任何您可以使用
foreach
的东西。

它是。。。某物你可以绕过去。这可能是一个列表或数组,或者(几乎)任何支持
foreach
循环的东西。它适用于希望能够使用带有
foreach
循环的对象,但不知道要处理的是什么类型的对象,是数组、列表还是自定义对象

这是第一个优势:如果你的方法接受IEnumerable而不是数组或列表,它们会变得更强大,因为你可以向它们传递更多不同类型的对象

现在,让IEnumerable真正脱颖而出的是迭代器块(C#中的
yield
关键字)。迭代器块像列表或数组一样实现IEnumerable接口,但它们非常特殊,因为与列表或数组不同,迭代器块一次通常只保存单个项的状态。因此,如果您想在一个非常大的文件中的行上循环,例如,您可以编写一个迭代器块来处理文件输入。这样,您的内存中一次就不会有超过一行的文件,如果您提前完成循环(可能是搜索,找到了所需内容),您可能不需要读取整个文件。或者,如果您正在读取大型SQL查询的结果,则可以将内存使用限制为单个记录

另一个特性是这种计算是惰性的,因此,如果您在读取可枚举项时正在执行复杂的工作来计算它,那么在请求它之前,这项工作不会发生。这是非常有益的,因为通常(比如,再次搜索)您会发现您可能根本不需要做这些工作

您可以将IEnumerable想象为一个即时列表。
  • 它是一个基本接口,使我们能够循环或迭代集合

  • 关于IEnumerable最重要的一点是,当您遍历一个对象或 集合它一次只保存单个项的状态

  • 在遍历大型对象或集合时,它具有良好的性能 因为它不会为了进行迭代而将整个对象加载到内存中。对于 例如,假设您决定逐行读取一个大文件,并在其上执行某些操作 因此,您可以编写自己的来读取文件 具有高性能

  • 当您使用IEnumerable编写查询时,您使用了延迟查询的优点 执行并在访问时运行查询

  • 每次在集合中运行迭代时,都会出现不同的 已创建集合。例如,在以下代码中,每次
    listOfFiles
    访问
    ListOfAllFiles
    时,都会再次执行

    public static void Main()
    {
        var listOfFiles = ListOfAllFiles();
    
        var filesCount = listOfFiles.Count();
        var filesAny = listOfFiles.Any();
        var fileIterate = listOfFiles.Select(x => x.FullName);
    }
    
    private static IEnumerable<FileInfo> ListOfAllFiles()
    {
        foreach(var file in Directory.EnumerateFiles(Environment.CurrentDirectory))
        {
            yield return new FileInfo(file);
        }
    }
    
    publicstaticvoidmain()
    {
    var listOfFiles=ListOfAllFiles();
    var filescont=listOfFiles.Count();
    var filesAny=listOfFiles.Any();
    var fileIterate=listOfFiles.Select(x=>x.FullName);
    }
    私有静态IEnumerable ListOfAllFiles()
    {
    foreach(目录.EnumerateFiles(Environment.CurrentDirectory)中的var文件)
    {
    返回新的文件信息(文件);
    }
    }
    

老实说,对于初学者来说,MSDN的定义非常可怕,因为你只想做一个foreach。虽然我能理解为什么它关闭了,但我是在MSDN不太清楚之后从谷歌了解到这一点的,答案确实帮助了我。如果可以的话,我会投票支持重新开放……在谷歌搜索“What is IEnumerable”时,这一点很重要,我相信其他人也会发现这一点很有帮助。你可以用GetEnumerator方法查看任何内容。它不必支持IEnumerable.yeah,但大多数情况下,
IEnumerable foreach
注意,根据这里显示的语法,C#5相当于foreach。在C#4及更早版本中,
对象obj在while循环之外声明,这会改变循环在处理捕获匿名函数等变量时的行为。tech-over-tech-answer只会带来更多的困惑和挫折。
IEnumarable
的关键是,在专门扩展之前,备份集合不会枚举,是foreach还是通过in访问器