2012-02-10 6 views
2

の配列の要素を変更し、私はのTableRow構造体を持っていると、このような構造体の配列テーブルのC#:検索と構造体

table = new TableRow[10]; 

今、私は1つのコンテンツを見つけて、操作したいです配列内の構造体の配列。
私は右の配列要素を検索するArray.Findを使用します。

var tr = Array.Find(table, tRow => tRow.color == 'red'); 
tr.count++; 

問題は、構造体は値型ですので、Findメソッドは、私が操作したい構造体のコピーを返すことです。このコピーを変更しても、配列内の構造体は変更されません。

参照で構造体を返すようにFindメソッドに指示する方法がないようです。

+1

TableRow構造体を表示できますか?あなたがカスタム構造体型を必要とするのはまれなケースです。合計フィールドのサイズが16バイトより大きければクラスに変換することを考えてください – sll

+0

...または初期化の後にフィールドを変更する必要がある場合。 – Douglas

答えて

4

Find()の値の種類を変更することはできません。 structclassに変換することができます。通常は、いずれも「単一」の値を表す非常に小さい(< = 16バイト)値タイプの場合にのみstructを使用します。 MSDNはここclassstructに良い指針を持っている:Chossing Between Classes and Structs

それとも、配列内の位置を取得するためにFindIndex()を使用して、フィールドを変更するためにそれを使用することができます。

var pos = Array.FindIndex(table, tRow => tRow.color == 'red'); 

if (pos >= 0) 
{ 
    table[pos].count++ 
} 
+0

ありがとう、ジェームズ。 3つの答えの中で最も完全で最速のので、チェックマークが付いています。 – Jpsy

+1

ありがとう!私が最初にC#に入ったとき、私は構造体対クラスの多くの先入観を持っていましたが、彼らは自分の長所と短所を持つ非常に異なる鳥です。 Douglas氏は、値渡しのセマンティクスのために、不変の値(DateTime'、TimeSpan'などがすべて重要な例です)に最適である傾向があります。 <= 16バイト(一般的に)、それらは単一の値( 'DateTime'など)に最適です。 –

2

構造体は値型であるため、TableRowの新しいインスタンスを作成し、その要素を置き換える必要があります。 Array.FindIndexを使用して要素のインデックスを検索できます。

+0

ありがとうEugene ... – Jpsy

3

FindIndexを使用すると、一致する要素の0から始まるインデックスを取得し、その代わりに変更することができます。

int i = Array.FindIndex(table, tRow => tRow.color == 'red'); 
table[i].count++; 

ただし、構造体は(ほとんどの場合は)不変である必要があります。

  • それは論理的に類似する単一の値を表し:設けMSDNリンク@James(強調追加)あたり:タイプは、以下の特性の全てを有している場合を除き

    構造を定義しませんプリミティブ型(整数、倍精度など)

  • インスタンスサイズが16バイト未満です。
  • 不変です。
  • 頻繁にボックスに入れる必要はありません。

あなたは、あなたが最初の場所で構造体を使用すべきではない、あなたのTableRowインスタンスのcountを更新していきますので。私の意見では、クラスに変換する方が良いでしょう。

+0

ありがとうダグラス。構造体が常に不変でなければならないという明確なヒントは、私がそのトピックに関するより多くの情報をすばやく見つけることを可能にしました。私は間違いなくクラスに変換されます。 – Jpsy