Создание 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();
Ответ 3
Вы можете использовать Enumerable.Repeat
IEnumerable<MyObject> listOfMyObjetcs = Enumerable.Repeat(CreateMyObject, numberOfObjects);
Подробнее читайте https://msdn.microsoft.com/en-us/library/bb348899(v=vs.110).aspx