【问题标题】:Elegant way to implement repetition block in C# [duplicate]在 C# 中实现重复块的优雅方法 [重复]
【发布时间】:2017-05-31 21:38:29
【问题描述】:

编码中的一个常见模式是使用迭代变量来做某事一定次数。在很多情况下,迭代变量只是作为循环终止条件,而为此添加了几行代码。

例子,

int counter=100;
while ( counter > 0)
{
//Do something
counter--;
}

.NET 框架是否提供了一种方法来定义编码块(在示例中执行某些操作)然后执行给定次数,从而消除上面的条件检查和递减语句。这是为了减少可见语句的数量。

编辑:我正在寻找减少代码数量的方法,而不是提高底层调用的效率。

【问题讨论】:

  • 那就是for(..){..} 声明。
  • for each + lambda functions?
  • C# 中的 for 循环。 .net 运行时通常会展开简单的循环,这意味着在现实中比较少很多,稍微加快了循环速度。
  • 条件检查和递减是代码中的性能问题的可能性大约为 0%,如果您实际上首先遇到性能问题,那么您几乎可以肯定有更好的事情可以花时间.
  • 请定义“优雅”。

标签: c# loops


【解决方案1】:

怎么了

for (int counter = 0; counter < limit; counter++)
{
//Do something
}

它是一个立即可识别的成语

【讨论】:

  • 你还有一个“递减语句”和“条件检查”
  • @flaZer:然后呢?您可以自己展开循环,或让 .net 运行时展开它。
  • @flaZer:好吧,OP 确实抱怨“为此目的添加了几行代码”,这可以节省。
  • 我不记得 OP 抱怨过,也没有要求减轻他的代码 - 而是询问是否有可能做某事,但似乎并非如此。
  • hmm 但是变量声明和初始化仍然在这里int counter = 0 和计数器增量也在这里counter++ 以及条件验证
【解决方案2】:

.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(() => Console.WriteLine("hello"))

请注意,如果您将要重复的代码提取到与Action签名匹配的方法中,那么上面的代码会变得更清晰:

100.Times(DoSomething);

【讨论】:

  • @flaZer:这是由 (Sergey) 库函数提供的,不是最终程序员必须编写的。所以它确实回答了这个问题。 OP 并没有建议不需要递减和条件检查,只是他不想为每个循环都编写它。
  • 根据另一篇帖子,我想要的方式无法完全完成,但这是最接近可接受的答案。
【解决方案3】:

您可以使用Enumerable.Repeat 来解决问题,但不确定这是否真的是您认为的优雅

编辑:

一个小例子,你可以用这个方法生成 100 个不同的随机值。稍加调整即可满足您的需求

var ran = new Random();  
var results = Enumerable.Repeat<Func<int>>(ran.Next, 100)
    .Select(f => f())
    .ToArray();

编辑: 我以为你可以自己做,但有些人需要澄清:

Enumerable.Repeat(100, () =>
{
    // Do what you want
});

来源(更多详情):

http://geekswithblogs.net/BlackRabbitCoder/archive/2012/05/03/c.net-little-wonders-the-enumerable.repeat-static-method.aspx

【讨论】:

  • 它是Enumerable.Repeat 而不是IEnumerable.Repeat,但它也会按顺序重复一个对象,它不会重复执行一个动作,正如这里所问的那样。
  • 我编辑了我的答案,你可以再看看(在我的手机上,有点难写一个完整的答案,我不应该)
  • 所以你已经编辑了你的答案,让它执行一大堆完全不必要的工作(不需要随机数,或者创建一个数组)并且 仍然没有按照问题的要求执行,即执行某些代码给定的次数,而是创建给定数量的对象。这不是问题所要求的。
  • 伙计,你能试着理解一下吗?代码示例只是为了展示如何绘制 100 个随机值。你可以用你想要的任何东西替换ran.Next 调用。你读过我链接的文章吗?
  • 已编辑。你能承认我的回答是真的,现在别管我吗?
猜你喜欢
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多