79

IEnumeratorC# で sを使用する方法 (理由ではない) を思い出すのに苦労しています。私はJavaに慣れており、初心者向けにすべてを非常にうまく説明している素晴らしいドキュメントがあります。どうぞ、ご容赦ください。

これらのボードの他の回答から学ぼうとしましたが、役に立ちませんでした。以前に尋ねられた一般的な質問をするのではなく、私にとって物事を明確にする具体的な例があります。

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

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

4

5 に答える 5

109

に関するドキュメントは次のとおりIEnumeratorです。それらはリストの値を取得するために使用されますが、長さは必ずしも事前にわかっているわけではありません (わかっていても)。enumerateこの言葉は、「1つずつ数えたり、名前を付けたりする」という意味の に由来します。

IEnumeratorおよび.NET のIEnumerator<T>allIEnumerableおよびインターフェイス (後者は両方を提供) によって提供されます。ステートメントはこれらのインターフェイス メソッドを介して列挙子を直接操作するように設計されているため、これは重要です。IEnumerable<T>GetEnumerator()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();
}
于 2011-09-05T16:20:16.770 に答える
19
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 コンストラクトを使用するか、単に

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

また

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

後者の 2 つはLINQを使用しており、 の(**)シンタックス シュガーにすぎません(*)

于 2011-09-05T16:21:18.323 に答える
9

私があなたを正しく理解していれば、C#ではyield returnコンパイラの魔法だけで十分だと思います。

例えば

IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
    foreach(string item in sequence)
    {
         yield return item + "roxxors";
    }
}
于 2011-09-05T16:18:53.790 に答える
5

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

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

シンプルなもの:)

于 2011-09-05T16:15:35.537 に答える
4

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

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

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

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

于 2011-09-05T16:36:41.267 に答える