2008-10-07 52 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); 
     } 
    } 
}