At present, I'm using something like this to build a list of 10 objects:
myList = (from _ in Enumerable.Range(0, 10) select new MyObject {...}).toList()
Run Code Online (Sandbox Code Playgroud)
This is based off my python background, where I'd write:
myList = [MyObject(...) for _ in range(10)]
Run Code Online (Sandbox Code Playgroud)
Note that I want my list to contain 10 instances of my object, not the same instance 10 times.
Is this still a sensible way to do things in C#? Is there a cost to doing it this way over a simple for loop?
在这种情况下,Fluent API看起来更具可读性,但是不容易看到代码的意图:
var list = Enumerable.Range(0, 10).Select(_ => new MyObject()).ToList();
Run Code Online (Sandbox Code Playgroud)
简单如果循环快速且易于理解,但它也隐藏了意图 - 创建10个项目的列表
List<MyObject> list = new List<MyObject>();
for (int i = 0; i < 10; i++)
list.Add(new MyObject());
Run Code Online (Sandbox Code Playgroud)
可读性最好的是构建器,它将描述您的意图
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;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
var list = Builder<MyObject>.CreateListOfSize(10);
Run Code Online (Sandbox Code Playgroud)
这个解决方案和简单的循环一样快,意图非常明确.同样在这种情况下,我们只需要编写最少量的代码.
你可以试试:
Enumerable.Range(0, 1000).Select(x => new MyObject()).ToArray();
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我认为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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以你可以
EnumerableEx.Repeat(10, () => new object()) //.ToList()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9569 次 |
| 最近记录: |