2012-11-25 3 views
7

、私は10個のオブジェクトのリストを構築するために、このようなものを使用しています:linqを使用して繰り返し要素の配列を初期化するにはどうすればよいですか?現在

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

これは私が書きたい私のpythonの背景を、オフに基づいています。

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

注意していること私のリストには、同じインスタンスではなく、10回のオブジェクトが含まれています。

これはまだC#で​​やることに賢明な方法ですか?単純なforループよりもこのようにコストがかかりますか?

+0

MyObjectのどこかでRange値を使用していますか、または任意のオブジェクトが必要ですか? – Tilak

+0

@Tilak:任意のオブジェクト(したがってアンダースコア) – Eric

+0

IMOシンプルなループは、LINQクエリではなく、無視できるほど優れています(可読性/パフォーマンス)。 – Tilak

答えて

4

個人的には、Enumerable.Repeatに過負荷がありません。あなたはあなたが試すことができ

EnumerableEx.Repeat(10,() => new object()) //.ToList() 
+0

オーバーロードによって切断されない場合、関数の反復可能性を10回繰り返すことはできません。 – Eric

+0

2つの場合を戻り値の型で区別することができます – Eric

1

ので

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

できます:

Enumerable.Range(0, 1000).Select(x => new MyObject()).ToArray(); 
8

流暢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

'Enumerable.Range(0、10)'は11個の値を返します – Eric

+3

@Ericかなり確実な第2引数は 'count'です –

+2

訂正しました – Eric

関連する問題