有什么方法可以在 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
我写了一个函数,接受 (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