1

C#3.0のイテレータ/列挙子のセクションを簡単に読んだことがありますが、それを理解するのにまだ苦労しています。それらの名前から、私の最初の考えは、イテレータがEnumerableオブジェクトのグループを反復処理することです。私は正しい方向に進んでいますか?もしそうなら、?のような一般的なジェネリックコレクションはList<T>どうですか?Listは、一部の操作中にIteratorを作成/使用しますか?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を提供します:)これはIEnumeratorを返すメソッドGetEnumerator()を定義するインターフェイスです。メソッドは何度でも呼び出すことができ、常にIEnumeratorの新しいインスタンスを取得できます。

IEnumeratorには、プロパティCurrentとメソッドMoveNext()およびReset()があり、コレクションの列挙が可能です。列挙自体は、 MoveNext()を呼び出し、 MoveNext()の前の呼び出しがtrueを返した場合に、 Currentプロパティを読み取ることで実行できます。

実装と使用法の良い例は、ドキュメントにあります:http: //msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx

于 2011-04-06T23:39:29.247 に答える
1

それらの名前から、私の最初の考えは、イテレータがEnumerableオブジェクトのグループを反復処理することです。私は正しい方向に進んでいますか?もしそうなら、リストのような一般的な一般的なコレクションはどうですか?Listは、一部の操作中にIteratorを作成/使用しますか?

イテレータは、を返すメソッドを実装する方法です。これIEnumerable<T>は実際には実装の詳細です。コレクションを列挙するためにカスタムクラスを作成する代わりに、イテレータを使用して実装することができ、コンパイラがあなたに代わって大変な作業を行います。

IEnumerableのリターンタイプを使用すると何が得られますか?

これにより、基本的にタイプを列挙できます。たとえば、2番目のメソッド(私が個人的に呼び出すGetArticles)では、次のように記述できます。

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

私がこれに答えることができるかどうか見てみましょう。

したがって、リストはIEnumerableを実装し、それを実装する必要があるのはTではありません。たとえば、forechまたはforループを使用して、リスト内のすべてを反復処理できます。Listのようなジェネリックリストを使用する場合、これはTのリストであることを意味します。Tはユーザーが定義したオブジェクトタイプです。つまり、キャストする必要はありませんが、そのリスト内の同じタイプのオブジェクト。

あなたがそこに持っているコードは、一連のことを意味する可能性があります:

1-IEnumerableを実装するすべての変数は、GetArticleの結果を保持できます。例:

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

2-クエリの実際の処理は遅れます。たとえば、Countを呼び出すと、メソッドを呼び出した後、実際に実行/解決されます。

3-番号2のため、コードが示すようにDBでこれを行う場合は、リストを使用するまで接続を開いたままにする必要があります。そうしないと、例外が発生します。

私は質問に答えたと思います。

于 2011-04-06T23:40:05.377 に答える