2016-08-18 6 views
3

私はC#の新機能が魅力的です。多くのコードを参照していますが、ここでは構文に詳しいことはありません。そこで私はここでやったことをやるための簡単な方法があるかどうか疑問に思っていました。プロパティとしての配列。

私は様々なプロパティと機能を持つクラスを持っています。それらの1つは整数を返すpublic int gettypeforitem(int i)です。 すべてのアイテムのタイプの配列を返すタイプint[]のプロパティを定義します。

私はC++に由来しているので、次のコードは私にとっては論理的だと思われますが、C#でこれを行うにはもっと「真っ直ぐな」方法があるのだろうかと思っていました。 ありがとうございました!

public int[] type 
{ 
     get 
     { 
      List<int> _list = new List<int>(); 
      for(uint i=0; i<NumberOfItems;i++) 
       _list.Add(gettypeforitem(i)); 
      return _list.ToArray(); 
     } 
} 
+0

public IEnumerable<int> type { get { for(uint i=0; i<NumberOfItems;i++) yield return gettypeforitem(i); } } 

、次に:ない場合は、代替としても、これを使用することができます提供された答えを使用するときには、 'System.Linq'名前空間を含めてください。 –

答えて

3

あなたはアイテムの数を知っているので、あなたはすぐに配列を作成することができます

int[] _arr = new int[NumberOfItems]; 
for(uint i=0; i<NumberOfItems;i++) 
    _arr[i] = gettypeforitem(i); 
return _arr; 

それとも、オーバーヘッドを気にしない場合:

Enumerable.Range(0, NumberOfItems).Select(gettypeforitem).ToArray(); 
13
public int[] type 
{ 
    get 
    { 
     return Enumerable.Range(0, NumberOfItems).Select(gettypeforitem).ToArray(); 
    } 
} 

更新: コメントで示唆されているように、C#の命名規則ndards:

public int[] Types 
{ 
    get 
    { 
     return Enumerable.Range(0, NumberOfItems).Select(getTypeForItem).ToArray(); 
    } 
} 
+4

ラムダの代わりにメソッドグループを使用して選択を単純化することができます。私。 'Select(gettypeforitem)' –

+0

良い点@Glorin Oakenfoot、今すぐ私の答えを更新してください。 – serhiyb

+0

私たちはC#領域上にあるので、公共のプロパティでは小文字を使用しないことをお勧めします。 メソッドの代わりにreadonlyプロパティも私を苛立たせます。おそらく私は間違っていますが、プロパティセマンティクスを破ると思います。 初心者に悪いことを教えてはいけません。 –

20

LINQは、ここに進むべき道である、私が言うと思います:

public int[] Types => Enumerable.Range(0, NumberOfItems) 
           .Select(i => GetTypeForItem(i)) 
           .ToArray(); 

私は.NETの命名規則に従うように名前を変更した、これはC#6の表現ボディを使用していますプロパティ構文。このよう

は、プロパティのために仕事の比較的大量をしている - 新しい配列にすべての呼び出しを生成、スタートのために - あなたはそれの代わりに方法することを検討することをお勧めします:

public int[] GetTypes() => Enumerable.Range(0, NumberOfItems) 
            .Select(i => GetTypeForItem(i)) 
            .ToArray(); 

に述べたように

public int[] GetTypes() => Enumerable.Range(0, NumberOfItems) 
            .Select(GetTypeForItem) 
            .ToArray(); 

メソッドグループの変換は、引数常にELとして有効なときのための正確な規則を:他の場所でのコメント、あなたSelectメソッドに引数のメソッドグループの変換を使用することができるかもしれ私はここでそれらを要約しようとはしません。 (時間とともに変化してきました)

+0

これは非常に有望です。私の 'GetTypeForItem(uint i)'は 'uint'のみを受け入れ、' Select'の 'i'は' int'を使うように思えるので、問題に遭遇しました。どういうわけか '私'のタイプを変更できますか? – tzippy

+0

@tzippy:あなたはそれをキャストできました。しかし、 'GetTypeForItem'メソッドを変更することも考えられます.Unit' *は良いアイデアのように聞こえますが、.NETコードは実際には' int'をベースにしています。 –

2

本当にプロパティの戻り値の型は配列でなければなりませんか?確認してください。..ちょうどあなたは、あなたがC#に慣れていたので、以下に提供され、答えをコメントとして

myObject.type.ToArray(); 
関連する問題