C # метод, который может выполнить любой код в цикле - PullRequest
2 голосов
/ 26 октября 2010

Например, если мне нужно набрать что-то подобное несколько раз, есть ли способ поместить этот цикл в метод с параметрами, такими как LoopMethod(Code lines, int count)

        for (int i = 0; i <= 1000; i++)
        {
            code line 1;
            code line 2;
            ...
            code line N;
        }

        for (int i = 0; i <= 1000; i++)
        {
            code line 1;
            code line 2;
            ...
            code line N;
        }

, если в результате получится нечто подобное.

LoopMethod{
            code line 1,
            code line 2,
            ...
            code line N,
            1000
}

Ответы [ 4 ]

3 голосов
/ 26 октября 2010

Вот вариант:

public static LoopMethod(int iterations, Action<int> body)
{
    for (int i = 0; i < iterations; i++)
        body(i);
}

Вы бы назвали это так:

LoopMethod(100, i =>
{
    code line;
    code line;
});
2 голосов
/ 26 октября 2010

Более общей формой было бы сначала создать метод расширения:

public static class Extension
{
    public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
    {
        foreach(var currentItem in enumerable)
        {
            action(currentItem);
        }
    }
}

Затем, используя это, вы можете сделать следующее:

        Enumerable.Range(0, 1000).ForEach(i =>
                                              {
                                                  Console.WriteLine(i);
                                              });

Что будет повторять от 0 до 999 (используйте 1001 как второй параметр для включительно) Дополнительным преимуществом является то, что это затем работает для любого перечислимого типа.

0 голосов
/ 26 октября 2010

Вы можете использовать лямбда-выражение, например:

LoopMethod(() => {code line 1; code line 2;}, 100);

Объявление метода будет выглядеть примерно так:

void LoopMethod (Action code, int count) {
     for (int i = 0; i < count; i++) {
         code();
     }
}

Там может быть странная синтаксическая ошибка (я ее не проверял), но подход должен работать.

0 голосов
/ 26 октября 2010

Ну, вы можете сделать это с делегатами довольно легко:

public static void LoopMethod(Action loopCode, int count)
{
    for (int i = 0; i < count ; ++i) loopCode();
}

public static void Main()
{
    LoopMethod(() => {
        code line 1;
        code line 2;
        code line 3;
    }, 100);
}

Вы можете изменить это так, как вам нравится, даже изменив его на Action<int>, который принимает в качестве параметра текущий счетчик цикла.См. Ответ @ Гейба для варианта Action<int>:)

Конечно, я должен задаться вопросом, почему вы хотите воспроизвести такую ​​явно встроенную конструкцию, как зацикливание?

...