有什么方法可以在 C# 中用 Enumerable.Repeat 方法重复 Func<T, T> 吗?

Is there any way to repeat a Func<T, T> with Enumerable.Repeat method in C#?

我写了一个函数,接受 (Func & int N) 并重复 Func N 次,returns 一个结果。

public IEnumerable<T> MyFunction(Func<T, T> function, int iteration)
{

}

有什么方法可以使用 Enumerable.Repeat 重复一个函数吗?

public IEnumerable<T> MyFunction(Func<T, T> function, int iteration)
{
    yield return Enumerable.Repeat<T>(function.Invoke(), iteration);
}

我尝试 运行 上面的代码,但是函数 运行 一次。

为什么不简单地循环调用该方法:

for(int i = 0; i < iteration; i++)
    yield return function(myTInstance);

或 Linq-statement:

return Enumerable.Range(0, iteration).Select(x => function(MyTInstance));
// this is wrong

public IEnumerable<T> MyFunction(Func<T, T> function, int iteration)
{
    yield return Enumerable.Repeat<T>(function.Invoke(), iteration);
}

你 return 整个 IEnumerable 集合 return 由 Repeat(...) 编辑一次(毫无意义)。

你的方法的另一个问题是return类型。如果你想 return 你的 Func 对象,你必须将你的方法的 return 类型从 IEnumerable<T> 替换为 Func<T,T>.

Enumerable.Repeat<T>(...) 方法的目的是创建一个包含给定对象的 N 个实例的集合和 return 整个集合.

如果你想要 return 个对象,你必须 return 一个一个地 return 这些对象。

我想你需要这样的东西: (为了更好地理解,我没有使用 LINQ 和 lambda 表达式)

public Func<T,T> MyFunction(Func<T, T> function, int iteration)
{
    // create a collection with `N = interation` items
    IEnumerable<Func<T,T>> items = Enumerable.Repeat<T>(function.Invoke(), iteration);

    // return items
    foreach(Func<T,T> item in items)
    {
        yield return item;
    }
}

有办法,虽然我不确定它能证明什么。

static public IEnumerable<T> MyFunction<T>(Func<T> function, int iteration)
{
    return Enumerable.Repeat(function, iteration).Select( x => x() );
}

public static void Main()
{
    int n = 0;

    foreach (var i in MyFunction(() => n++, 10)) Console.WriteLine(i);
}

出于某种原因,人们这样做更常见:

    return Enumerable.Range(0, iteration).Select( x => function() );

我一直在 Whosebug 上看到后者的构造。

输出:

0
1
2
3
4
5
6
7
8
9