C# 在C语言中实现重复块的优雅方法#
编码中的一种常见模式是使用迭代变量执行一定次数的操作。在许多情况下,迭代变量仅用作循环终止条件,但为此目的添加了几行代码 例如C# 在C语言中实现重复块的优雅方法#,c#,loops,C#,Loops,编码中的一种常见模式是使用迭代变量执行一定次数的操作。在许多情况下,迭代变量仅用作循环终止条件,但为此目的添加了几行代码 例如 int counter=100; while ( counter > 0) { //Do something counter--; } NET framework是否提供了一种定义编码块(在示例中执行某些操作)然后执行给定次数的方法,从而消除了上述条件检查和递减语句。这是为了减少可见语句的数量 编辑:我正在寻找减少代码数量的方法,而不是使底层调用高效。在.NET
int counter=100;
while ( counter > 0)
{
//Do something
counter--;
}
NET framework是否提供了一种定义编码块(在示例中执行某些操作)然后执行给定次数的方法,从而消除了上述条件检查和递减语句。这是为了减少可见语句的数量
编辑:我正在寻找减少代码数量的方法,而不是使底层调用高效。在.NET Framework中,没有任何选项可以在不记录已执行某项操作的次数的情况下执行N次 但是您可以编写自己的扩展来隐藏所有这些内容。例如
public static void Times(this int count, Action action)
{
if (count < 0)
throw new ArgumentException(nameof(count));
for(int i = 0; i < count; i++)
action();
}
请注意,如果将要重复的代码提取到与操作
签名匹配的方法中,则上述代码将变得更干净:
100.Times(DoSomething);
怎么了
for (int counter = 0; counter < limit; counter++)
{
//Do something
}
for(int counter=0;counter
这是一个可以立即识别的习语你可以使用枚举。重复来做这个把戏,不确定这是否真的是你所认为的优雅 编辑: 这个小例子演示了如何用这个方法生成100个不同的随机值。只要稍加调整,它就能满足你的需要
var ran = new Random();
var results = Enumerable.Repeat<Func<int>>(ran.Next, 100)
.Select(f => f())
.ToArray();
资料来源(更多详情):
这将是(…{…}语句的
。对于每个
+lambda函数
?C#中的for
循环。net运行时通常会展开简单的循环,这意味着实际上比较少,循环速度略有加快。在代码中,条件检查和减量大约有0%的可能性是性能问题,您几乎可以肯定有更好的事情要做,如果你一开始确实有性能问题。请定义“优雅”。你还有一个“递减语句”和“条件检查”@flaZer:and?你可以自己展开循环,也可以让.net运行时展开循环。@flaZer:好吧,OP确实抱怨过“为此目的添加了几行代码”,这会节省时间。我不记得OP抱怨过,也没有要求减轻他的代码,而是询问是否可以做些什么,它似乎不是。嗯,但是变量声明和初始化仍然在这里int counter=0
,计数器增量也在这里counter++
以及条件validation@flaZer:这是由(Sergey)库函数提供的,而不是最终程序员必须编写的东西。所以它确实回答了这个问题。OP并没有建议递减和条件检查是不必要的,只是他不想为每个循环编写它。根据另一篇文章,我想要的方式不能完全实现,但这是最接近可接受的答案。它是可枚举的。重复而不是IEnumerable。重复,但它也会按顺序重复一个对象,它不会重复执行一个动作,就像这里被问到的那样。我编辑了我的答案,你可以再看一下(在我的手机上,很难写出完整的答案,我不应该这样),所以你编辑了你的答案,让它执行一大堆完全不必要的工作(不需要随机数,也不需要创建数组)你仍然没有按照问题的要求去做,也就是在给定的次数内执行某些代码,而是在创建给定数量的对象。这不是问题的要求。伙计,你能试着理解一下吗?代码的示例只是展示如何绘制100个随机值。你可以替换ran.Next
调用你想看什么就看什么。你读过我链接的文章吗?编辑过。你能承认我的答案是正确的吗,现在让我一个人呆着?
var ran = new Random();
var results = Enumerable.Repeat<Func<int>>(ran.Next, 100)
.Select(f => f())
.ToArray();
Enumerable.Repeat(100, () =>
{
// Do what you want
});