5

Id と Name を持つwhere List<Cat>isCatがあります。struct

ID 7 の猫の名前を変更するにはどうすればよいですか?

やった(思わず)

var myCat = catList.Single(c => c.Id == 7);

mycat.Name = "Dr Fluffykins";

もちろん、構造体は値型です。このような手法を使用することは可能ですか、それともループに変更.Singleforてインデックスを格納し、更新された構造体に置き換える必要がありますか?

4

2 に答える 2

1

ID が 7 のリスト内の項目の値を更新するには、まずリスト内でその位置を見つける必要があります。そのインデックスが分かれば、すべての露出フィールド構造に適用できる通常のアプローチを使用して更新できます。

int index = myList.Find( it => it.ID == 7);
if (index >= 0)
{
  var temp = myList[index];
  temp.Name = "Dr Fluffykins";
  myList[index] = temp;
}

上記のコードは最後の行がないと機能しないため、構造体はクラスよりも劣っていると考える人もいることに注意してください。私は反対のことを主張します.多くの場合、それらは優れています. 対照的に、問題の型が変更可能なクラスである場合、最後の行の有無にかかわらず、コードは期待どおりに機能するか、意図しない副作用を引き起こす可能性があります。

ちなみに、大量に使用する場合は、ではなくIdを使用することをお勧めします。または、 aとともに aを使用して、配列内のさまざまな猫の位置を追跡することもできます。この後者のアプローチの利点の 1 つは、 を使用すると、 とは異なり、次のように簡単に言うことができることです。Dictionary<int, Cat>List<Cat>Cat[]Dictionary<int,int>Cat[]List<Cat>

myArray[index].Name = "Dr Fluffykins";

配列内のアイテムを直接更新します。このようなアプローチは非常に効率的です。あるいは、メソッド "とメソッドList<T>を含む のようなクラスを作成することもできます。これらのメソッドを呼び出すこともできます。変数の場合は、変数または非 ref パラメーターとして渡さずにアイテムに 格納できることに注意してください。ただし、ラムダローカル変数を閉じるものは、そうでないものよりもはるかに遅くなります。ActOnItem(int index, ref T it)ActOnItem<TParam1>(int index, ref T it, ref TParam1 param1)myList.ActOnItem(index, (ref Cat it)=>it.Name = "Dr Fluffykins");theNewNamemyList.ActOnItem(index, (ref Cat it, ref string TheNewName)=>it.Name = theNewName);theNewNameref

于 2013-07-15T17:32:55.673 に答える