3

我有结构列表。我想修改结构中的特定数据。该结构位于列表的特定索引位置。

我想做这样的事情:

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;
}
4

3 回答 3

6

问题是列表索引器创建了结构的副本,即它实际上是:

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

请注意,数组的工作方式不同;使用数组,您正在触摸 struct in place,因此以下操作可以正常工作:

for(int i=0; i < list.Count; i++)
{
  someArray[i].a = someotherlist[i].data;
}

另一种方法是将数据复制出来(get 访问器),对其进行变异,然后将其放回:

for(int i=0; i < list.Count; i++)
{
  var completelyIsolatedClone = list[i];
  completelyIsolatedClone.a = someotherlist[i].data;
  list[i] = completelyIsolatedClone;
}

或者更好的是,acoid 可变结构完全,也许使用将更改应用于副本的方法:

for(int i=0; i < list.Count; i++)
{
  list[i] = list[i].SetA(someotherlist[i].data);
}

whereSetA创建一个的结构,例如DateTime.AddDays等,即

public SomeType SetA(int a) {
    return new SomeType(this.X, this.Y, a, this.Z);
}
于 2012-06-26T06:59:04.227 回答
2

你不能这样做的原因是因为 Sample 是一个struct,如果你把它改成一个类,那么你可以修改它。结构是按值传递的,也就是说,当方法返回结构时,返回的是结构的副本,而不是原始结构。因此,当list[i].a = someotherlist[i].data;运行时,您实际上是在修改副本并且原始结构没有被更改。编译器会阻止您这样做,因为这可能不是您想要的。

你可以看看这个线程为什么我不能从通用集合中修改项目的值)?

于 2012-06-26T06:54:48.407 回答
0

我刚刚修改了我的代码,它对我来说很好

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;
                }
            }
        }
于 2012-06-27T04:18:12.177 回答