我编写了一个接受(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);
}
我尝试运行上面的代码,但是该函数运行一次。
答案 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