2012-02-17 6 views
1

オブジェクトの宣言とインスタンス化された配列を短くするにはどうすればよいですか?最も単純な方法で、オブジェクトの配列をインスタンス化しますか?

class clsPerson{public int x, y;}

...

clsPerson[] objArr = new clsPerson[1000]; //How invoke here constructor? without creating for loop and objArr[i] = new clsPerson();

+4

ちょうど不思議なことに、なぜ名前を 'clsPerson'とし、' Person'ではないのですか?それはクラスであることは明らかです。ほとんどのクラスはクラスです。 –

+0

http://stackoverflow.com/a/1739047/932418 –

+0

私は(恥ずかしいことに)答えることができると思います。これはVB6の古いクラスの名前付け方法でした。私は当然知っているわけではありません。 –

答えて

7

あなたは、各項目のコンストラクタを呼び出す必要があります。配列を割り振り、各項目を構築せずにアイテムに対してクラスコンストラクターを呼び出す方法はありません。あなたが使用してループから(ほんの少し)で、それを短縮することができ

個人的に
clsPerson[] objArr = Enumerable.Range(0, 1000).Select(i => new clsPerson()).ToArray(); 

を、私はまだそれを介してアレイとループを割り当てる(および/またはヘルパールーチンに移動)したいです、しかし、それは非常に明確でまだかなりシンプルだとして:

clsPerson[] objArr = new clsPerson[1000]; 
for (int i=0;i<1000;++i) 
    clsPerson[i] = new clsPerson(); 
+0

ええと、私はそれがかなりシンプルだと知っていますが、私は多くの機能が次のように表示されています: リストリスト=新しいリスト({1,2,3}); または foreach(新しい文字列の文字列[] {"aaa"、 "bbb"}) – mike00

+0

@Maniekbまあ、私が言ったように - あなたはそれを行うためにLINQを使うことができますが、 –

+0

@Maniekbもちろん、初期化子で 'new clsPerson()'を1000回入力したいと思えば、配列初期化子の構文を使うことができます。 – phoog

12

コンストラクタは、このシナリオでは、アレイ内のすべての項目に対して実行する必要があります。ループを使用するかどうかにかかわらず、配列初期化子またはヘルパー・メソッドのすべての要素を参照する必要があります。

それがそうするように理にかなっている場合は、以下の

public static T[] CreateArray<T>(int count) where T : new() { 
    var array = new T[count]; 
    for (var i = 0; i < count; i++) { 
    array[i] = new T(); 
    } 
    return array; 
} 

clsPerson[] objArary = CreateArray<clsPerson>(1000); 
+0

ありがとう、でも私は他の何かを意味しました。良いテンプレート:)。 array [i] = .. – mike00

0

を使用することができてもあなただけの手軽な構文を探しているなら、あなたはstruct Personclass clsPersonを変更することができます。 structは常にデフォルト値を持ちます。

関連する問題