Почему вызов метода не выполняется при добавлении его результата в список? - PullRequest
1 голос
/ 05 февраля 2020

Когда Repeat(item, nr)) добавляется к res с res.Add(Repeat(item, nr)), метод Repeat не выполняется.

Почему? Я использовал отладчик, и он не выполняет его.

public class Program
{
    public static IEnumerable<IEnumerable<T>> Echo<T>(IEnumerable<T> src, int nr)
    {
        List<IEnumerable<T>> res = new List<IEnumerable<T>>();
        foreach (T item in src)
        {
            Console.Write(item);
            res.Add(Repeat(item, nr));
        }
        return res;
    }

    static IEnumerable<T> Repeat<T>(T item, int nr)
    {
        for (int i = 0; i < nr; i++)
        {
            Console.Write(item);
            yield return item;
        }
    }

    public static void Main()
    {
        string[] src = { "a", "b", "c" };
        Echo(src, 2);
    }

}

1 Ответ

2 голосов
/ 05 февраля 2020

Перечислители, созданные с yield return, не выполняются до тех пор, пока они не будут повторены. Таким образом, вам нужно иметь некоторый код, который перебирает перечислитель, добавленный в список. Поскольку вы ничего не делаете с перечислителем, возвращаемым Echo (не говоря уже о элементах внутри него), перечислитель никогда не выполняется.

...