私はIEnumerableとIEnumeratorを経由していましたが、明確に1つのポイントを取得できませんでした。foreachがある場合、なぜこの2つのインターフェイスが必要ですか?インターフェイスを使用しなければならないシナリオはありますか?はいの場合、例を挙げて説明することができます。 ご意見、ご感想は大歓迎です。おかげさまで IEnumerable、IEnumeratorとforeach、いつ使用するか
答えて
foreach
は、多くの場合、インターフェイスをにします。 にの文字列を実装したい場合は、foreach
のインタフェースを使用する必要があります。 (イテレータブロックは通常、この実装タスクを非常に簡単にします)。
ただし、ちょうどイテレータを直接使用すると便利です。良い例は、2つの異なるシーケンスを「ペアにする」ときです。たとえば、名前の1つと年代の2つのシーケンスを受信し、2つのシーケンスを一緒に印刷するとします。あなたは書くかもしれません:あなたの場合は、今すぐ
public T Max<T>(IEnumerable<T> items)
{
Comparer<T> comparer = Comparer<T>.Default;
using (IEnumerator<T> iterator = items.GetEnumerator())
{
if (!iterator.MoveNext())
{
throw new InvalidOperationException("No elements");
}
T currentMax = iterator.Current;
// Now we've got an initial value, loop over the rest
while (iterator.MoveNext())
{
T candidate = iterator.Current;
if (comparer.Compare(candidate, currentMax) > 0)
{
currentMax = candidate;
}
}
return currentMax;
}
}
:
static void PrintNamesAndAges(IEnumerable<string> names, IEnumerable<int> ages)
{
using (IEnumerator<int> ageIterator = ages.GetEnumerator())
{
foreach (string name in names)
{
if (!ageIterator.MoveNext())
{
throw new ArgumentException("Not enough ages");
}
Console.WriteLine("{0} is {1} years old", name, ageIterator.Current);
}
if (ageIterator.MoveNext())
{
throw new ArgumentException("Not enough names");
}
}
}
は、同様に、あなたが(たとえば)扱いたい場合は残りの部分に異なった最初の項目をイテレータを使用することが有用であり得ますIEnumerator<T>
とIEnumerable<T>
の違いに興味があるなら、テーブルとしてIEnumerable<T>
と考えると、カーソルとしてIEnumerator<T>
と考えることができます。テーブルに新しいカーソルを与えるように頼むことができます。また、同時に同じテーブルに複数のカーソルを置くこともできます。
この相違点は本当にありがたいですが、リスト(または配列など)に「リストにある場所」という概念はありませんが、そのリスト/ array/whatever はのビットがあると便利です。
ジョンが言ったこと。
IEnumerable
またはIEnumerable<T>
:オブジェクトは、それはあなたがシーケンス/コレクションを超えるトラバースするために使用することができますイテレータを与えることができると述べて、これを実装することによって/IEnumerator
またはIEnumerator<T>
を設定します。あなたが定義されたGetEnumeratorメソッドを呼び出す場合前のインタフェースでは、イテレータオブジェクトをIEnumerator参照として取得します。これにより、MoveNext()を呼び出してCurrentオブジェクトを取得することができます。foreach
:それはフードの下でどのように動作するかを知る必要がないという意味で、C#の構造/ファサードです。内部的にイテレータを取得し、各アイテム(foreachブロックの内容)で何をしたいかに集中するための正しいメソッドを呼び出します。ほとんどの場合、独自のタイプまたはカスタム反復を実装している場合を除いて、foreachが必要になります。その場合は、最初の2つのインタフェースを知る必要があります。それが必要とするすべてのMoveNextメソッド()メソッドが返すたオブジェクトを返すGetEnumeratorメソッド()メソッドで、IIRCを - あなたははforeachのを使用するために、そののIEnumeratorとvarientsを実装するを持っていない心の中で
私にもっと分かりやすくしてくれたGishuに感謝します。 また、このリンクは非常に便利です: http://stackoverflow.com/questions/558304/can-anyone-explain-ienumerable-and-ienumerator-to-me – Wondering
ベアbool、およびオブジェクトを返すCurrentプロパティ。 IEnumeratorとIEnumerableは使用する必要はありませんが、一般的にIEnumeratorとIEnumerableを使用するのは非常に良い考えです。詳細については、hereを参照してください。
これは奇妙な古い獣です2つのメソッドを実装するだけです。これを行う際の大きな問題は、タイプシステムがそのオブジェクトが列挙可能であることを知らないことです。オブジェクトにLinqを使用することで問題が発生すると思います。 –
はい、それは奇妙です。その機能をサポートする理由は、C#1.0で整数のコレクションを記述し、ボクシングなしでそれらを列挙できるようにするためです。 IE
@Eric Lippert:GetEnumeratorメソッドが構造体を返すクラスには、クラスを返すIEnumerable.GetEnumeratorメソッドが必要であることを示唆していますが、構造体列挙子のヒープ割り当てを避けることができます。 – supercat
- 1. IEnumerableを&IEnumeratorをサフィックス
- 2. のIEnumerableとIEnumeratorを、あるいは私がコレクションについて学んでいたのforeachのC#
- 3. IEnumeratorとIEnumerableの違いは何ですか?
- 4. foreach between Ienumerable
- 5. IEnumerator <T>を返すメソッドをforeachループで使用できますか?
- 6. "yield"を使用すると、コンパイラ生成型がIEnumerableとIEnumeratorの両方を実装する理由
- 7. IEnumerableを<XElement>とforeachの
- 8. IEnumerableまたはIListのforeach
- 9. foreachをIEnumerableオブジェクトでプレフォームする方法
- 10. 1つのスクリプトでIEnumerator Start()とvoid Start()の両方を使用する
- 11. IteratorとIEnumerator
- 12. いつリスト<T> .ForEachをネイティブforeachループで使用しますか?
- 13. datastax c#ドライバIEnumerable <T> foreach optimize
- 14. C#クラスはIEnumerableであり、同時にIEnumeratorです。これに関する問題は何ですか?
- 15. StartCoroutineとのIEnumerator(ユニティ3D)
- 16. IEnumerable - foreachループ内のオブジェクトを更新する
- 17. IEnumerableとIEnumerableの違い<T>?
- 18. IEnumerableを使用する方法
- 19. COM - C++でIEnumerableを使用する
- 20. C#でIEnumerableをListに使用する
- 21. IEnumerableを使用するASP.NETポストメソッド
- 22. コルーチンとコールバックの使い方は? IEnumeratorから配列を取り出す
- 23. 値を返すIEnumerator
- 24. C#で2つのIEnumerableの各要素のペアでforeachを実行する方法はありますか?
- 25. HashTableのIEnumerator?
- 26. IEnumerable <T>でIEnumerableを使用する必要がある場合は、
- 27. 文字列によるIEnumerable参照のForeach
- 28. C#IEnumeratorを使用して汎用リストコレクションを作成する方法
- 29. foreachループ内でIEnumerableが期待通りに更新されない(C#、MVC2&Linqを使用)
- 30. foreachでリターンを使用すると、medooでエコーされない
ありがとうございました。私は今それを得て、それを明確にするためにもっと研究します。 また、次のリンクは非常に便利です: http://stackoverflow.com/questions/558304/can-anyone-explain-ienumerable-and-ienumerator-to-me – Wondering
これはIEnumeratorを使用して立ち往生した場所の例です効率を維持する。 http://stackoverflow.com/questions/1018407/what-is-the-most-elegant-way-to-get-a-set-of-items-by-index-from-a-collection/1025137#1025137 –
@ジョンスキート私はあなたがコード化した方法を本当に好きでしたメソッド。私は1つの質問があります。 IEnumberatorでconstructを使用しています。私は使用することがそれの中に来るものを処分することを知っている()。なぜあなたはIEnumberatorでそれを使いましたか? –