Создание N объектов и их добавление в список

У меня есть метод, который принимает N, количество объектов, которые я хочу создать, и мне нужно вернуть список из N объектов.

В настоящее время я могу сделать это с помощью простого цикла:

    private static IEnumerable<MyObj> Create(int count, string foo)
    {
        var myList = new List<MyObj>();

        for (var i = 0; i < count; i++)
        {
            myList .Add(new MyObj
                {
                    bar = foo
                });
        }

        return myList;
    }

И мне интересно, есть ли другой способ, возможно, с LINQ, чтобы создать этот список.

Я пробовал:

    private static IEnumerable<MyObj> CreatePaxPriceTypes(int count, string foo)
    {
        var myList = new List<MyObj>(count);

        return myList.Select(x => x = new MyObj
            {
                bar = foo
            });

    }

Но это, похоже, заполняет мой список.

Я попытался изменить выбор в foreach, но это та же самая сделка.

Я понял, что список имеет емкость count, и LINQ не находит какие-либо элементы для итерации.

        myList.ForEach(x => x = new MyObj
        {
            bar = foo
        });

Существует ли правильный оператор LINQ, чтобы заставить его работать? Или я должен просто придерживаться цикла?

Ответы

Ответ 1

Вы можете использовать Range для создания последовательности:

return Enumerable.Range(0, count).Select(x => new MyObj { bar = foo });

Если вы хотите создать List, вам нужно будет ToList его.

Имейте ввиду, что это (возможно) неочевидное решение, поэтому пока не выкидывайте итеративный способ создания списка.

Ответ 2

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

// Func<int, T>: The int parameter will be the index of each element being created.

public static IEnumerable<T> CreateSequence<T>(Func<int, T> elementCreator, int count)
{
    if (elementCreator == null)
        throw new ArgumentNullException("elementCreator");

    for (int i = 0; i < count; ++i)
        yield return (elementCreator(i));
}

public static IEnumerable<T> CreateSequence<T>(Func<T> elementCreator, int count)
{
    if (elementCreator == null)
        throw new ArgumentNullException("elementCreator");

    for (int i = 0; i < count; ++i)
        yield return (elementCreator());
}

Затем вы можете использовать их следующим образом:

int count = 100;

var strList = CreateSequence(index => index.ToString(), count).ToList();

string foo = "foo";
var myList = CreateSequence(() => new MyObj{ Bar = foo }, count).ToList();