Есть ли способ повторить Func <T, T> с методом Enumerable.Repeat в C #? - PullRequest
0 голосов
/ 25 мая 2019

Я написал функцию, которая принимает (Func & int N), повторяет Func N раз и возвращает результат.

public IEnumerable<T> MyFunction(Func<T, T> function, int iteration)
{

}

Есть ли способ повторить функцию, используя Enumerable.Repeat?

public IEnumerable<T> MyFunction(Func<T, T> function, int iteration)
{
    yield return Enumerable.Repeat<T>(function.Invoke(), iteration);
}

Я пытался запустить приведенный выше код, но функция запускается один раз.

Ответы [ 3 ]

1 голос
/ 25 мая 2019
// this is wrong

public IEnumerable<T> MyFunction(Func<T, T> function, int iteration)
{
    yield return Enumerable.Repeat<T>(function.Invoke(), iteration);
}

вы возвращаете всю коллекцию IEnumerable, возвращаемую Repeat (...) за один выход (бессмысленно).

Другая проблема вашего метода - тип возвращаемого значения. Если вы хотите вернуть ваши объекты Func, вы должны заменить тип возврата вашего метода с IEnumerable<T> на Func<T,T>.

Цель метода Enumerable.Repeat<T>(...) - создать коллекцию с N экземплярами данного объекта и вернуть всю коллекцию .

Если вы хотите вернуть объекты в выходах, вы должны возвращать эти объекты один за другим.

Я думаю, вам нужно что-то вроде этого: (для лучшего понимания я не использую LINQ и лямбда-выражения)

public Func<T,T> MyFunction(Func<T, T> function, int iteration)
{
    // create a collection with `N = interation` items
    IEnumerable<Func<T,T>> items = Enumerable.Repeat<T>(function.Invoke(), iteration);

    // return items
    foreach(Func<T,T> item in items)
    {
        yield return item;
    }
}
1 голос
/ 25 мая 2019

Есть способ, хотя я не уверен, что он доказывает.

static public IEnumerable<T> MyFunction<T>(Func<T> function, int iteration)
{
    return Enumerable.Repeat(function, iteration).Select( x => x() );
}

public static void Main()
{
    int n = 0;

    foreach (var i in MyFunction(() => n++, 10)) Console.WriteLine(i);
}

По какой-то причине, однако, чаще люди видят это так:

    return Enumerable.Range(0, iteration).Select( x => function() );

Я все время вижу последнюю конструкцию в Stackoverflow.

Выход:

0
1
2
3
4
5
6
7
8
9
1 голос
/ 25 мая 2019

Почему бы просто не вызвать метод в цикле:

for(int i = 0; i < iteration; i++)
    yield return function(myTInstance);

или в заявлении Linq:

return Enumerable.Range(0, iteration).Select(x => function(MyTInstance));
...