// this is wrong
public IEnumerable<T> MyFunction(Func<T, T> function, int iteration)
{
yield return Enumerable.Repeat<T>(function.Invoke(), iteration);
}
你在单个yield语句中返回了Repeat(...)返回的整个IEnumerable集合(没有意义)。
你方法的另一个问题是返回类型。如果你想返回Func对象,必须将方法的返回类型从IEnumerable替换为Func。
Enumerable.Repeat(...)方法的目的是创建一个包含给定对象的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;
}
}
Enumerable.Repeat
可以运行一个Action
多次的文档吗?我所能找到的唯一文档是说它会返回一个指定次数的某种值的可枚举对象。 - Heretic MonkeyEnumerable.Repeat<Action>(() => { Console.WriteLine("Hello World"); },10).ToList().ForEach(f => f.Invoke());
@HereticMonkey - Saleh BagheriToList
。 - Heretic MonkeyRepeat
构建一些重复函数的奇怪东西,所以从技术上讲,答案是肯定的。Repeat
可以重复任何内容。但这样做会变得异常复杂。下一个开发人员可能会感到困惑,可能会使用循环重新编写它,然后担心有更复杂的情况发生,而他们只是错过了它。当他们意识到他们没有错过任何东西时,他们会感到失落,并想:“哦,不,我还会在这里找到什么别的吗?” - Scott Hannen