Logo
Section 1 / 10

LINQ 和 IEnumerable 类型

了解 LINQ 和 IEnumerable 类型。

导入

LINQ 和 IEnumerable 类型

了解 LINQ 和 IEnumerable 类型。

IEnumerable 类型

LINQ 是 IEnumerable 类型上的一组扩展方法。IEnumerable 类型表示我们可以遍历的对象,例如数组、列表、字典等。

IEnumerable 类型包含一个 GetEnumerator() 方法,该方法返回一个 IEnumerator。通过这个 IEnumerator,我们可以遍历集合,因为它具有 MoveNext 方法和 Current 属性。MoveNext 方法用于将枚举器移动到下一个位置,而 Current 属性则保存当前所在位置的元素。

...
IEnumerator's MoveNext method and Current property

如果集合为空,或者迭代器到达集合末尾,则 MoveNext 方法返回 false。否则,它返回 true,并且 Current 属性会被更新为当前位置的元素。

让我们遍历我们的电影目录,打印出每部电影的名字。

1using System; 2using System.Collections.Generic; 3 4namespace MovieCatalog 5{ 6 internal class Program 7 { 8 private static void Main(string[] args) 9 { 10 var movies = new List<Movie> 11 { 12 new Movie("Titanic", 1998, 4.5f), 13 new Movie("The Fifth Element", 1997, 4.6f), 14 new Movie("Terminator 2", 1991, 4.7f), 15 new Movie("Avatar", 2009, 5), 16 new Movie("Platoon", 1986, 4), 17 new Movie("My Neighbor Totoro", 1988, 5) 18 }; 19 20 using (var enumerator = movies.GetEnumerator()) 21 { 22 if (enumerator.MoveNext()) 23 { 24 do 25 { 26 var movie = enumerator.Current; 27 Console.WriteLine(movie.Name); 28 } while (enumerator.MoveNext()); 29 } 30 } 31 } 32 } 33 34 internal class Movie 35 { 36 public Movie(string name, int releaseYear, float rating) 37 { 38 Name = name; 39 ReleaseYear = releaseYear; 40 Rating = rating; 41 } 42 43 public string Name { get; set; } 44 45 public int ReleaseYear { get; set; } 46 47 public float Rating { get; set; } 48 } 49}

注意,我们使用 using 声明和 GetEnumerator 方法(第 20 行)为 movies 列表创建了一个枚举器。为了开始读取 movies 列表,我们通过调用 MoveNext 方法(第 22 行)将迭代器置于初始位置。然后,我们读取当前电影并打印其名称(第 26-27 行)。我们持续打印电影,直到枚举器到达 movies 列表的末尾,使用的是 do-while 循环。

我们并不需要手动使用 IEnumerator。每次编写对集合的 foreach 循环时,实际上都在利用 IEnumerable 及其底层的 IEnumerator 类型。

这次,我们使用 foreach 循环来遍历电影目录。

1using System; 2using System.Collections.Generic; 3 4namespace MovieCatalog 5{ 6 internal class Program 7 { 8 private static void Main(string[] args) 9 { 10 var movies = new List<Movie> 11 { 12 new Movie("Titanic", 1998, 4.5f), 13 new Movie("The Fifth Element", 1997, 4.6f), 14 new Movie("Terminator 2", 1991, 4.7f), 15 new Movie("Avatar", 2009, 5), 16 new Movie("Platoon", 1986, 4), 17 new Movie("My Neighbor Totoro", 1988, 5) 18 }; 19 20 foreach (var movie in movies) 21 { 22 Console.WriteLine(movie.Name); 23 } 24 } 25 } 26 27 internal class Movie 28 { 29 public Movie(string name, int releaseYear, float rating) 30 { 31 Name = name; 32 ReleaseYear = releaseYear; 33 Rating = rating; 34 } 35 36 public string Name { get; set; } 37 38 public int ReleaseYear { get; set; } 39 40 public float Rating { get; set; } 41 } 42}

我们只需使用 foreach 循环(第 20 行)。foreach 循环在后台自动使用 IEnumerator 完成所有循环逻辑。

入门

什么是扩展方法?