Ars*_*nko 39 .net c# linq .net-4.0
在C#中,使用.NET Framework 4,是否有一种优雅的方法可以重复执行相同的操作一定次数?例如,而不是:
int repeat = 10;
for (int i = 0; i < repeat; i++)
{
Console.WriteLine("Hello World.");
this.DoSomeStuff();
}
Run Code Online (Sandbox Code Playgroud)
我想写一些类似的东西:
Action toRepeat = () =>
{
Console.WriteLine("Hello World.");
this.DoSomeStuff();
};
toRepeat.Repeat(10);
Run Code Online (Sandbox Code Playgroud)
要么:
Enumerable.Repeat(10, () =>
{
Console.WriteLine("Hello World.");
this.DoSomeStuff();
});
Run Code Online (Sandbox Code Playgroud)
我知道我可以为第一个例子创建我自己的扩展方法,但是不存在一个现有的功能,这使得它已经可以做到这一点吗?
Ale*_*Aza 46
像这样?
using System.Linq;
Enumerable.Range(0, 10).ForEach(arg => toRepeat());
Run Code Online (Sandbox Code Playgroud)
这将执行您的方法10次.
[编辑]
我很习惯ForEach
在Enumerable上使用扩展方法,我忘了它不是FCL的一部分.
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
action(item);
}
Run Code Online (Sandbox Code Playgroud)
如果没有ForEach
扩展方法,您可以执行以下操作:
Enumerable.Range(0, 10).ToList().ForEach(arg => toRepeat());
Run Code Online (Sandbox Code Playgroud)
[编辑]
我认为最优雅的解决方案是实现可重用的方法:
public static void RepeatAction(int repeatCount, Action action)
{
for (int i = 0; i < repeatCount; i++)
action();
}
Run Code Online (Sandbox Code Playgroud)
用法:
RepeatAction(10, () => { Console.WriteLine("Hello World."); });
Run Code Online (Sandbox Code Playgroud)
Dom*_*nic 24
没有内置的方法来做到这一点.
原因是C#试图强制在语言的功能和命令方面之间划分.C#只有在不产生副作用时才能轻松进行函数式编程.因此,你得收集,处理方法,如LINQ的Where
,Select
等等,但你没有得到ForEach
.1
以类似的方式,你在这里尝试做的是找到一些表达本质上是命令行动的功能方式.虽然C#为您提供了执行此操作的工具,但它并不会让您感觉轻松,因为这样做会使您的代码不清晰且不具有惯用性.
1有一个List<T>.ForEach
,但不是一个IEnumerable<T>.ForEach
.我想说存在的List<T>.ForEach
是一个历史的神器,源于框架设计者在.NET 2.0时代没有考虑过这些问题; 只有在3.0中才能明确划分明确的分工.
小智 9
为了简化一个班轮你可以做到这一点.不确定你的想法......
Enumerable.Repeat<Action>(() =>
{
Console.WriteLine("Hello World.");
this.DoSomeStuff();
}, 10).ToList().ForEach(x => x());
Run Code Online (Sandbox Code Playgroud)
如果没有推出自己的扩展,我想你可以做这样的事情
Action toRepeat = () => {
Console.WriteLine("Hello World.");
this.DoSomeStuff();
};
int repeat = 10;
Enumerable.Range(0, repeat).ToList().ForEach(i => toRepeat());
Run Code Online (Sandbox Code Playgroud)
Enumerable.Repeat<Action>(() => { Console.WriteLine("Hello World"); this.DoSomething(); },10).ToList().ForEach(f => f.Invoke());
Run Code Online (Sandbox Code Playgroud)
优雅不是吗?
归档时间: |
|
查看次数: |
35609 次 |
最近记录: |