C#でIEnumerator
sを使用する方法(理由ではない)を思い出せない。私はJavaに慣れており、初心者向けにすべてを非常にうまく説明している素晴らしいドキュメントを持っています。だから、どうか我慢してください。
私はこれらのボード上の他の回答から何の役にも立たないように学習しようとしました。以前に既に尋ねられた一般的な質問をするのではなく、私にとって物事を明確にする特定の例を持っています。
IEnumerable<String>
オブジェクトを渡す必要があるメソッドがあるとします。メソッドが行う必要があるのは、イテレータ内のすべてのroxxors
の末尾に文字String
を連結することだけです。次に、この新しいイテレータを返します(もちろん、元のIEnumerable
オブジェクトはそのまま残ります)。
これについてどうすればいいですか?ここでの答えは、もちろん私に加えて、これらのオブジェクトに関する基本的な質問に役立つはずです。
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();
}
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 を使用し、(**)
は(*)
の単なる構文上の砂糖です。
私があなたを正しく理解している場合、C#ではyield return
コンパイラの魔法が必要だと思います。
例えば.
IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
foreach(string item in sequence)
{
yield return item + "roxxors";
}
}
私は次のようなことをします:
private IEnumerable<string> DoWork(IEnumerable<string> data)
{
List<string> newData = new List<string>();
foreach(string item in data)
{
newData.Add(item + "roxxors");
}
return newData;
}
シンプルなもの:)
また、LINQのSelectメソッドを使用できます。
var source = new[] { "Line 1", "Line 2" };
var result = source.Select(s => s + " roxxors");
詳細はこちら Enumerable.Selectメソッド