web-dev-qa-db-ja.com

簡単なIEnumeratorの使用(例付き)

C#でIEnumeratorsを使用する方法(理由ではない)を思い出せない。私はJavaに慣れており、初心者向けにすべてを非常にうまく説明している素晴らしいドキュメントを持っています。だから、どうか我慢してください。

私はこれらのボード上の他の回答から何の役にも立たないように学習しようとしました。以前に既に尋ねられた一般的な質問をするのではなく、私にとって物事を明確にする特定の例を持っています。

IEnumerable<String>オブジェクトを渡す必要があるメソッドがあるとします。メソッドが行う必要があるのは、イテレータ内のすべてのroxxorsの末尾に文字Stringを連結することだけです。次に、この新しいイテレータを返します(もちろん、元のIEnumerableオブジェクトはそのまま残ります)。

これについてどうすればいいですか?ここでの答えは、もちろん私に加えて、これらのオブジェクトに関する基本的な質問に役立つはずです。

66
BlackVegetable

IEnumerator のドキュメントを次に示します。それらは、リストの値を取得するために使用されます。リストの値は、(事前にわかっていても)事前にわかっている必要はありません。 Wordはenumerateに由来します。これは、「カウントオフするか、1つずつ名前を付ける」ことを意味します。

IEnumeratorおよびIEnumerator<T>は、GetEnumerator()を介して.NETのすべてのIEnumerableおよびIEnumerable<T>インターフェイス(両方が提供する)によって提供されます。 foreachステートメントは、これらのインターフェイスメソッドを介して列挙子と直接連携するように設計されているため、これは重要です。

たとえば、次のとおりです。

IEnumerator enumerator = enumerable.GetEnumerator();

while (enumerator.MoveNext())
{
    object item = enumerator.Current;
    // Perform logic on the item
}

になる:

foreach(object item in enumerable)
{
    // Perform logic on the item
}

特定のシナリオに関しては、.NETのほとんどすべてのコレクションがIEnumerableを実装しています。そのため、次のことができます。

public IEnumerator Enumerate(IEnumerable enumerable)
{
    // List implements IEnumerable, but could be any collection.
    List<string> list = new List<string>(); 

    foreach(string value in enumerable)
    {
        list.Add(value + "roxxors");
    }
    return list.GetEnumerator();
}
96
Paul Walls
public IEnumerable<string> Appender(IEnumerable<string> strings)
{
  List<string> myList = new List<string>();
  foreach(string str in strings)
  {
      myList.Add(str + "roxxors");
  }
  return myList;
}

または

public IEnumerable<string> Appender(IEnumerable<string> strings)
{
  foreach(string str in strings)
  {
      yield return str + "roxxors";
  }
}

yield construct を使用するか、単に

var newCollection = strings.Select(str => str + "roxxors"); //(*)

または

var newCollection = from str in strings select str + "roxxors"; //(**)

後者の2つは LINQ を使用し、(**)(*)の単なる構文上の砂糖です。

18
Rune

私があなたを正しく理解している場合、C#ではyield returnコンパイラの魔法が必要だと思います。

例えば.

IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
    foreach(string item in sequence)
    {
         yield return item + "roxxors";
    }
}
8
Ben Robinson

私は次のようなことをします:

private IEnumerable<string> DoWork(IEnumerable<string> data)
{
    List<string> newData = new List<string>();
    foreach(string item in data)
    {
        newData.Add(item + "roxxors");
    }
    return newData;
}

シンプルなもの:)

5
Mike

また、LINQのSelectメソッドを使用できます。

var source = new[] { "Line 1", "Line 2" };

var result = source.Select(s => s + " roxxors");

詳細はこちら Enumerable.Selectメソッド

4
Slava Kovalchuk