2008-10-07 27 views
29

每次我需要使用C#我写这篇文章的代码任何模仿times()的方法C#中的Ruby方法?

for (int i = 0; i < N; i++) 
{ 
    ... 
} 

学习Ruby的我所学到的方法倍()可与相同的语义等用来做什么的算法里面ñ倍在C#这

N.times do 
    ... 
end 

代码片段看起来更加复杂,我们应该宣告无用变量

我试着写返回IEnumerable的扩展方法,但我不满意的结果,因为我又不得不声明变量一个周期。

public static class IntExtender 
{ 
    public static IEnumerable Times(this int times) 
    { 
     for (int i = 0; i < times; i++) 
      yield return true; 
    } 
} 

... 

foreach (var i in 5.Times()) 
{ 
    ... 
} 

是否有可能使用一些新的C#3.0语言功能,使ň时间周期更优雅?

回答

48

稍微简短版本的cvk's answer

public static class Extensions 
{ 
    public static void Times(this int count, Action action) 
    { 
     for (int i=0; i < count; i++) 
     { 
      action(); 
     } 
    } 

    public static void Times(this int count, Action<int> action) 
    { 
     for (int i=0; i < count; i++) 
     { 
      action(i); 
     } 
    } 
} 

用途:

5.Times(() => Console.WriteLine("Hi")); 
5.Times(i => Console.WriteLine("Index: {0}", i)); 
14

它确实有可能与C#3.0:

public interface ILoopIterator 
{ 
    void Do(Action action); 
    void Do(Action<int> action); 
} 

private class LoopIterator : ILoopIterator 
{ 
    private readonly int _start, _end; 

    public LoopIterator(int count) 
    { 
     _start = 0; 
     _end = count - 1; 
    } 

    public LoopIterator(int start, int end) 
    { 
     _start = start; 
     _end = end; 
    } 

    public void Do(Action action) 
    { 
     for (int i = _start; i <= _end; i++) 
     { 
      action(); 
     } 
    } 

    public void Do(Action<int> action) 
    { 
     for (int i = _start; i <= _end; i++) 
     { 
      action(i); 
     } 
    } 
} 

public static ILoopIterator Times(this int count) 
{ 
    return new LoopIterator(count); 
} 

用法:

int sum = 0; 
5.Times().Do(i => 
    sum += i 
); 

如果您使用的是.NET 3.5,那么你可以使用扩展方法从http://grabbagoft.blogspot.com/2007/10/ruby-style-loops-in-c-30.html

0

无耻被盗在本文中提出的每一个,并用它来避免经典循环。

public static class IEnumerableExtensions 
    { 
     public static void Each<T>(
     this IEnumerable<T> source, 
     Action<T> action) 
     { 
      foreach(T item in source) 
      { 
       action(item); 
      } 
     } 
    } 

这种特定的扩展方法斑点 焊缝一个上的任何内容的每个方法,其 实现IEnumerable。你知道 这是因为这个方法的第一个参数是 这个方法定义了方法体内的这个 。行动是 预定义的类,基本上 代表功能(代表) 返回没有价值。在该方法中, 是从列表中提取元素的地方 。这种方法 使我能够在一行代码中清晰地应用 函数。

http://www.codeproject.com/KB/linq/linq-to-life.aspx

希望这有助于。

+0

不是真的是我想要的,但有用的。谢谢! – 2008-10-07 08:39:53

0

我写我自己的扩展时报添加到整数(加上一些其他的东西)。你可以在这里得到代码:https://github.com/Razorclaw/Ext.NET

的代码非常相似乔恩斯基特答案:

public static class IntegerExtension 
{ 
    public static void Times(this int n, Action<int> action) 
    { 
     if (action == null) throw new ArgumentNullException("action"); 

     for (int i = 0; i < n; ++i) 
     { 
      action(i); 
     } 
    } 
}