私は構造のリストを持っています。構造体から特定のデータを変更したい。そして、構造はリストの特定のインデックス位置にあります。
私はこのようなことをしたい:
struct sample
{
int a;
string name;
}
List<sample> list = new List<sample>();
for(int i=0; i < list.Count; i++)
{
list[i].a = someotherlist[i].data;
}
私は構造のリストを持っています。構造体から特定のデータを変更したい。そして、構造はリストの特定のインデックス位置にあります。
私はこのようなことをしたい:
struct sample
{
int a;
string name;
}
List<sample> list = new List<sample>();
for(int i=0; i < list.Count; i++)
{
list[i].a = someotherlist[i].data;
}
問題は、リスト インデクサーが構造体のコピーを作成することです。つまり、実際には次のようになります。
for(int i=0; i < list.Count; i++)
{
var completelyIsolatedClone = list[i];
completelyIsolatedClone.a = someotherlist[i].data;
}
コンパイラは、明らかな間違いを防いでいます。あなたが持っているコードget
は、データの別のコピーを変更しますが、それを元に戻すことはありません - したがって、あなたの変更は何も役に立ちません。ただし、Mono の人々は、自分のやり方でうまくいけばいいと考えていることに注意してください: http://tirania.org/blog/archive/2012/Apr-11.html
配列の動作は異なることに注意してください。配列を使用すると、その場で構造体に触れているため、次のようにするとうまくいきます。
for(int i=0; i < list.Count; i++)
{
someArray[i].a = someotherlist[i].data;
}
もう 1 つの方法は、データをコピーして (get アクセサー)、変更し、元に戻すことです。
for(int i=0; i < list.Count; i++)
{
var completelyIsolatedClone = list[i];
completelyIsolatedClone.a = someotherlist[i].data;
list[i] = completelyIsolatedClone;
}
または、変更を新しいコピーに適用するメソッドを使用して、変更可能な構造体を完全に回避します。
for(int i=0; i < list.Count; i++)
{
list[i] = list[i].SetA(someotherlist[i].data);
}
whereは、 etc のような新しいSetA
構造体を作成します。DateTime.AddDays
public SomeType SetA(int a) {
return new SomeType(this.X, this.Y, a, this.Z);
}
それができない理由は、Sample が であるためですstruct
。それをクラスに変更すると、それを変更できます。構造体は値によって渡されます。つまり、構造体がメソッドによって返される場合、元の構造体ではなく、構造体のコピーが返されます。を実行list[i].a = someotherlist[i].data;
すると、実際にはコピーが変更され、元の構造は変更されません。おそらく意図したものではないため、コンパイラはこれを行うことを防ぎます。
あなたはこのスレッドを見ることができますWhy couldnot I modified the value of item from Generic Collections) ?
コードを次のように変更しただけで、問題なく動作します
public struct test
{
public int data;
public string name;
public int port_index;
}
static void Main(string[] args)
{
List<test> look_up = new List<test>();
test obj;
obj.data = 1;
obj.port_index = 0;
obj.name = "aaaa";
look_up.Add(obj);
test obj1;
obj1.data=3;
obj1.port_index=1;
obj1.name="sssss";
look_up.Add(obj1);
for(int i=0;i<look_up.Count;i++)
{
if (i == 1)
{
test temp = look_up[i];
temp.data = 5;
look_up[i] = temp;
}
}
}