1

我已经多次通读C# 3.0的迭代器/枚举器部分,但我仍然很难掌握它。从他们的名字来看,我最初的想法是 Iterator 会迭代一组 Enumerable 对象。我在正确的轨道上吗?如果是这样,那么常见的泛型集合,比如 aList<T>呢?List 在其某些操作期间是否创建/使用迭代器?T 是自动可枚举的吗?有演员表吗?一个甚至与另一个有任何关系吗?

在一些相关的说明中,在学习 MVC 时,我看到了如下代码:

public Article GetArticle(int id)
{
    return _siteDB.Articles.SingleOrDefault(a => a.ArticleID == id);
}

public IEnumerable<Article> GetArticle(string title)
{
    return _siteDB.Articles.Where(a => a.Title.StartsWith(title)).AsEnumerable<Article>();
}

有一个返回类型IEnumerable<T>给我什么?


编辑:好的,我想我开始明白了。我的困惑仍然是迭代器。这本书将他们描述为枚举器的生产者。我看不出实际发生在哪里yield return。每个产量都会创建一个新的枚举器吗?

4

3 回答 3

2

IEnumerable 类型为您提供 IEnumerable :) 它是一个接口定义方法GetEnumerator(),它返回 IEnumerator。您可以根据需要多次调用该方法,并且始终获得 IEnumerator 的新实例。

IEnumerator 有属性Current和方法MoveNext()Reset()允许集合枚举。如果先前的MoveNext() 调用返回 true ,则可以通过调用MoveNext()并读取Current属性来完成枚举本身。

实施和使用的好例子在文档中:http: //msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx

于 2011-04-06T23:39:29.247 回答
1

从他们的名字来看,我最初的想法是 Iterator 会迭代一组 Enumerable 对象。我在正确的轨道上吗?如果是这样,那么常见的泛型集合(例如 List)呢?List 在其某些操作期间是否创建/使用迭代器?

迭代器是一种实现返回 an 的方法的方法IEnumerable<T>——它实际上是一个实现细节。不必创建一些自定义类来枚举集合,您可以使用迭代器来实现它,编译器会为您完成艰苦的工作。

返回类型为 IEnumerable 会给我带来什么?

这基本上允许您枚举类型。例如,第二种方法(我个人称之为GetArticles)将允许您编写:

foreach(var article in GetArticle(theTitle))
{
   // Do something with article
}
于 2011-04-06T23:38:02.393 回答
1

看看我能不能回答这个问题。

因此,List 实现了 IEnumerable,而不是必须实现它的 T,列表中的任何内容都可以迭代,例如使用 forech 或 for 循环。如果您使用像 List 这样的通用列表,这意味着您拥有的是 T 的列表,其中 T 是您定义的对象类型,这意味着您不必强制转换它,但另一方面您只能放置该列表中相同类型的对象。

您那里的代码可能意味着一系列事情:

1 - 任何实现 IEnumerable 的变量都能够保存 GetArticle 的结果,例如:

List yourList = GetArticle("test");
Queue myQueue = GetArticle("test");

2 - 查询的实际处理将被延迟。例如,如果您调用 Count,则在调用该方法之后,这就是它实际执行/解决的时间。

3 - 由于数字 2,如果您按照代码建议在数据库上执行此操作,那么您的连接必须保持打开状态,直到您使用列表时,否则您将收到异常。

我想我已经回答了这些问题。

于 2011-04-06T23:40:05.377 回答