有什么方法可以用C#中的Enumerable.Repeat方法重复Func <t,t =“”>吗?

时间:2019-05-25 20:14:22

标签: c# func enumerable

我编写了一个接受(Func&int N)并重复执行Func N次并返回结果的函数。

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);
}

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

3 个答案:

答案 0 :(得分:1)

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

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

或在Linq语句中:

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

答案 1 :(得分:1)

// this is wrong

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

您以单个收益(毫无意义)返回由Repeat(...)返回的整个IEnumerable集合。

您的方法的另一个问题是返回类型。如果要返回Func对象,则必须将方法的返回类型从IEnumerable<T>替换为Func<T,T>

使用Enumerable.Repeat<T>(...)方法的目的是创建一个具有N个给定对象实例的集合,并返回整个集合

如果要以收益率返回对象,则必须一个接一个地返回这些对象。

我认为您需要这样的东西: (为了更好地理解,我没有使用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;
    }
}

答案 2 :(得分:1)

有一种方法,尽管我不确定它能证明什么。

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() );

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

输出:

0
1
2
3
4
5
6
7
8
9