Вопрос по .net-4.0, c#, linq, .net –  но это намного лаконичнее.

36

, используя .NET Framework 4, существует ли элегантный способ повторить одно и то же действие определенное количество раз? Например, вместо:

int repeat = 10;
for (int i = 0; i < repeat; i++)
{
    Console.WriteLine("Hello World.");
    this.DoSomeStuff();
}

Я хотел бы написать что-то вроде:

Action toRepeat = () =>
{
    Console.WriteLine("Hello World.");
    this.DoSomeStuff();
};

toRepeat.Repeat(10);

или же:

Enumerable.Repeat(10, () =>
{
    Console.WriteLine("Hello World.");
    this.DoSomeStuff();
});

Я знаю, что могу создать свой собственный метод расширения для первого примера, но разве не существует существующей функции, которая делает это возможным?

Ваш Ответ

1   ответ
23

Причина в том, что C # как таковой пытается навязать разделение между функциональной и императивной сторонами языка. C # облегчает функциональное программирование только тогда, когда оно не вызывает побочных эффектов. Таким образом, вы получаете методы манипуляции коллекцией, такие как LINQWhere, Selectи т. д., ноты не получаешьForEach.1

Подобным образом, то, что вы пытаетесь сделать здесь, - это найти какой-то функциональный способ выражения того, что по сути является обязательным действием. Хотя C # предоставляет вам инструменты для этого, он не пытается упростить вам задачу, поскольку делает ваш код неясным и неидиоматичным.

1 СуществуетList<T>.ForEach, но неIEnumerable<T>.ForEach, Я бы сказал, что существованиеList<T>.ForEach это исторический артефакт, проистекающий из того, что разработчики фреймворков не продумали эти проблемы во времена .NET 2.0; необходимость четкого разделения стала очевидной только в 3.0.

@ Domenic - я думаю, что ваше объяснение правильно, почему LINQ не помогает с этим. Однако это не относится к более широкому вопросу о том, почему в C # отсутствуетимператив способ сказать "повторить цикл n раз". Другие языки делают так. Или, по крайней мере, стать ближе к этому, как VBFor .. To .., что позволяет избежать семантического перебора в тестировании C # и увеличения или уменьшения переменной цикла, в общем случае перехода через диапазон значений. Мы застряли с синтаксисом, который был изобретен для C в 1970-х годах, потому что он был эффективен на DEC PDP-11, в котором были инструкции увеличения и уменьшения. ToolmakerSteve
Я полагаю, что иногда вам лучше написать мудрое представление.Enumerable должен делать то, что он подразумевает; перечислить. Хорошо, что дизайнеры сделали четкое различие между управляемыми коллекциями и повторяемыми коллекциями, чтобы избежать путаницы DerpyNerd
Могу ли я спросить, почему с помощьюForEach в качестве примера, такая плохая вещь? Coops
@CodeBlend, это сделало бы большой вопрос. Joe
Конечно, ничто не мешает вам написать свой собственный побочный эффектRepeat или жеForEach метод на IEnumerable - к этому моменту разработчики языка вымыли руки. geofftnz

Похожие вопросы