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();

ループが高速で理解しやすい場合はシンプルですが、意図も隠されます-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 に答える