有没有机会模仿时代()C#中的Ruby方法?

Ale*_*yev 29 c# ruby language-features cycle

每次我需要在使用C#的算法中做N次我写这个代码

for (int i = 0; i < N; i++)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

学习Ruby我已经学习了方法时间(),可以使用与此相同的语义

N.times do
    ...
end
Run Code Online (Sandbox Code Playgroud)

C#中的代码片段看起来更复杂,我们应该声明无用的变量i.

我试着编写返回IEnumerable的扩展方法,但我对结果不满意,因为我必须再次声明一个循环变量i.

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())
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用一些新的C#3.0语言功能使N次循环更优雅?

Jon*_*eet 49

一个稍微简短的cvk版本答案:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

5.Times(() => Console.WriteLine("Hi"));
5.Times(i => Console.WriteLine("Index: {0}", i));
Run Code Online (Sandbox Code Playgroud)


cvk*_*cvk 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);
}
Run Code Online (Sandbox Code Playgroud)

用法:

int sum = 0;
5.Times().Do( i => 
    sum += i
);
Run Code Online (Sandbox Code Playgroud)

http://grabbagoft.blogspot.com/2007/10/ruby-style-loops-in-c-30.html无耻地偷走