ソース関数(IEnumerable
を返す)の結果を他の処理関数(それぞれが受け取り、IEnumerable
を返す)のリストを通して渡す必要があります。奇妙な委任参照の振る舞い
これまではすべて問題ありませんでしたが、処理関数が入力エコーメントに対して複数のループを実行できるようにする必要があります。
IEnumerable<T>
を渡すのではなく、入力パラメータをFunc<IEnumerable<T>>
に変更し、必要に応じて各関数が列挙型を再起動できるようにすることを考えました。
残念ながら、私は今、最終処理機能が要求をチェーンに戻すのではなく、自分自身を呼び出しているスタックオーバーフローを取得しています。
サンプルコードは少し工夫されていますが、うまくいけば私が達成しようとしていることのアイデアが得られます。
class Program
{
public static void Main(string[] args)
{
Func<IEnumerable<String>> getResults =() => GetInputValues("A", 5);
List<String> valuesToAppend = new List<String>();
valuesToAppend.Add("B");
valuesToAppend.Add("C");
foreach (var item in valuesToAppend)
{
getResults =() => ProcessValues(() => getResults(),item);
}
foreach (var item in getResults())
{
Console.WriteLine(item);
}
}
public static IEnumerable<String> GetInputValues(String value, Int32 numValues)
{
for (int i = 0; i < numValues; i++)
{
yield return value;
}
}
public static IEnumerable<String> ProcessValues(Func<IEnumerable<String>> getInputValues, String appendValue)
{
foreach (var item in getInputValues())
{
yield return item + " " + appendValue;
}
}
}
最初の例では、StackOverflowのを避けたが、今返す:ACC、ACCなど – rob
@rob - (完了申し訳ありませんが、修正されます) –
ありがとうございます。今働いて!実世界の処理コードはメモリ内の多数の項目を処理する必要があるため、メモリが少ない状況でも動作させるには複数のパスが必要です。私は、IEnumerableがそれ自身で繰り返しできるほど巧妙であることを認識していませんでした。私はその動作に頼るべきではありません。 – rob