Asp.net mvc 2 枚举数、迭代器、IEnumerable-有点困惑

Asp.net mvc 2 枚举数、迭代器、IEnumerable-有点困惑,asp.net-mvc-2,iterator,ienumerable,enumerable,Asp.net Mvc 2,Iterator,Ienumerable,Enumerable,简而言之,我已经阅读了C#3.0的迭代器/枚举器部分好几次了,但我仍然很难掌握它。从它们的名字来看,我最初的想法是迭代器将迭代一组可枚举对象。我走对了吗?如果是的话,那么像列表这样的通用集合呢?List是否在某些操作期间创建/使用迭代器?T是否自动可枚举?有演员阵容吗?一个和另一个有关系吗 在学习MVC的过程中,我看到了如下代码: public Article GetArticle(int id) { return _siteDB.Articles.SingleOrDefault(a =

简而言之,我已经阅读了C#3.0的迭代器/枚举器部分好几次了,但我仍然很难掌握它。从它们的名字来看,我最初的想法是迭代器将迭代一组可枚举对象。我走对了吗?如果是的话,那么像
列表这样的通用集合呢?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>();
}
public-Article-GetArticle(int-id)
{
返回_siteDB.Articles.SingleOrDefault(a=>a.ArticleID==id);
}
公共IEnumerable GetArticle(字符串标题)
{
返回_siteDB.Articles.Where(a=>a.Title.StartsWith(Title)).AsEnumerable();
}
返回类型为
IEnumerable
给了我什么


编辑:好吧,我想我开始明白了。我仍然对迭代器感到困惑。这本书将他们描述为普查员的生产者。我看不出
收益率回报率的实际情况。每个产量是否创建一个新的枚举数

从它们的名字来看,我最初的想法是迭代器将迭代一组可枚举对象。我走对了吗?如果是这样,那么常见的泛型集合(如列表)又如何呢?List是否在某些操作期间创建/使用迭代器

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

拥有IEnumerable的返回类型给了我什么

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

foreach(var article in GetArticle(theTitle))
{
   // Do something with article
}
从它们的名字来看,我最初的想法是迭代器将迭代一组可枚举对象。我走对了吗?如果是这样,那么常见的泛型集合(如列表)又如何呢?List是否在某些操作期间创建/使用迭代器

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

拥有IEnumerable的返回类型给了我什么

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

foreach(var article in GetArticle(theTitle))
{
   // Do something with article
}

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

IEnumerator具有属性Current和方法MoveNext()和Reset(),允许集合枚举。枚举本身可以通过调用MoveNext()并在上一次调用MoveNext()返回true时读取当前属性来完成


文档中有一个很好的实现和使用示例:

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

IEnumerator具有属性Current和方法MoveNext()和Reset(),允许集合枚举。枚举本身可以通过调用MoveNext()并在上一次调用MoveNext()返回true时读取当前属性来完成


文档中有一个很好的实现和使用示例:

让我们看看我是否能回答这个问题

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

上面的代码可能意味着一系列事情:

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

2-查询的实际处理将延迟。例如,如果调用Count,则在调用该方法后,它实际上会被执行/解析

3-由于第2个原因,如果您按照代码建议在DB上执行此操作,那么您的连接必须保持打开状态,直到您使用列表为止,否则您将得到一个异常


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

让我们看看我是否能回答这个问题

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

上面的代码可能意味着一系列事情:

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

2-查询的实际处理将延迟。例如,如果调用Count,则在调用该方法后,它实际上会被执行/解析

3-由于第2个原因,如果您按照代码建议在DB上执行此操作,那么您的连接必须保持打开状态,直到您使用列表为止,否则您将得到一个异常

我想是的