9

目前,我正在使用这样的东西来构建一个包含 10 个对象的列表:

myList = (from _ in Enumerable.Range(0, 10) select new MyObject {...}).toList()

这是基于我的 python 背景,我会写:

myList = [MyObject(...) for _ in range(10)]

请注意,我希望我的列表包含我的对象的 10 个实例,而不是同一个实例 10 次。

这仍然是在 C# 中做事的明智方式吗?以这种方式通过简单的 for 循环执行此操作是否有成本?

4

3 回答 3

11

在这种情况下,Fluent API 看起来更具可读性,但不太容易看出代码的意图:

var list = Enumerable.Range(0, 10).Select(_ => new MyObject()).ToList();

简单的 if 循环快速且易于理解,但它也隐藏了意图 - 创建 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);

这个解决方案速度很快,就像简单的循环一样,意图非常明确。同样在这种情况下,我们要编写的代码量最少。

于 2012-11-25T17:01:10.633 回答
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()
于 2012-11-25T16:46:39.180 回答
3

你可以试试:

Enumerable.Range(0, 1000).Select(x => new MyObject()).ToArray();
于 2012-11-25T16:58:31.403 回答