我有一个方法,它接受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
});
}
但这似乎填满了我的名单。
我尝试将select更改为foreach但是同样的交易。
我意识到列表中有 capacity ,而LINQ没有找到任何要迭代的元素。
myList.ForEach(x => x = new MyObj
{
bar = foo
});
是否有正确的LINQ运算符可用于实现此功能?或者我应该坚持使用循环?
答案 0 :(得分:40)
您可以使用Range
创建序列:
return Enumerable.Range(0, count).Select(x => new MyObj { bar = foo });
如果您想创建List
,则必须ToList
。
请注意,它(可以说)是一个非显而易见的解决方案,所以不要抛弃创建列表的迭代方法。
答案 1 :(得分:4)
您可以创建通用的辅助方法,如下所示:
// 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();
答案 2 :(得分:0)
您可以使用Enumerable.Repeat
IEnumerable<MyObject> listOfMyObjetcs = Enumerable.Repeat(CreateMyObject, numberOfObjects);
有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/bb348899(v=vs.110).aspx