目前,我正在使用这样的东西构建一个包含10个对象的列表:
myList = (from _ in Enumerable.Range(0, 10) select new MyObject {...}).toList()
这是基于我的python背景,我写的是:
myList = [MyObject(...) for _ in range(10)]
请注意,我希望我的列表包含10个对象实例,而不是相同的实例10次。
这仍然是在C#中做事情的合理方式吗?通过简单的for循环这样做是否需要付出代价?
答案 0 :(得分:9)
在这种情况下,Fluent API看起来更具可读性,但是很难看出代码的意图:
var list = Enumerable.Range(0, 10).Select(_ => new MyObject()).ToList();
简单如果循环快速且易于理解,但它也隐藏了意图 - 创建10个项目的列表
List<MyObject> list = new List<MyObject>();
for (int i = 0; i < 10; i++)
list.Add(new MyObject());
可读性最好的是构建器,它将描述您的意图
public class Builder<T>
where T : new()
{
public static IList<T> CreateListOfSize(int size)
{
List<T> list = new List<T>();
for (int i = 0; i < size; i++)
list.Add(new T());
return list;
}
}
用法:
var list = Builder<MyObject>.CreateListOfSize(10);
此解决方案与简单循环一样快,意图非常明确。同样在这种情况下,我们只需要编写最少量的代码。
答案 1 :(得分:4)
就个人而言,我认为Enumerable.Repeat
缺少重载。一个方便的补充将是这样的:
public static class EnumerableEx
{
public static IEnumerable<T> Repeat<T>(int amt, Func<T> producer)
{
for(var i = 0; i < amt; ++i)
{
yield return producer();
}
}
}
所以你可以
EnumerableEx.Repeat(10, () => new object()) //.ToList()
答案 2 :(得分:1)
您可以尝试:
Enumerable.Range(0, 1000).Select(x => new MyObject()).ToArray();