代码是:
struct m1
{
public int a;
public int b;
}
int main()
{
List <m1> mList;
m1.initialize;
//new. and add some items to it.
现在我想访问mList中的对象 起初我试过了:
for each(m1 it in mList)
{
m1.a = 5;
}
但失败了。因为每次我在控制台上写了m1.first()。a。它的初始化值不是5。
然后我试了
for (int counter = 0; counter < mList.size(); counter++)
{
m1 it = mList[counter];
it.a = 5;
}
同样的问题。
然后我试了
for (int counter = 0; counter < mList.size(); counter++)
{
mList[counter].a = 5;
}
它甚至没有编译。它给了我一个错误。它说明了一些关于list.this [int]的不可修改的返回值。
然后我试了
for (int counter = 0; counter < mList.size(); counter++)
{
var m1 it = mList[counter];
it.a = 5;
}
它也不起作用。 我尽我所能,以及我在互联网和本网站上发现的一切。 你能帮忙找到一种方法来访问列表中对象(类型为struct)的参数吗? 显然,当列表来自对象(来自类)时,它很容易。如果我想从结构对象中创建一个列表,那就会出现复杂化。 任何帮助都会受到高度欢迎。
答案 0 :(得分:10)
问题在于您已将 struct 放入列表中。当你从列表中获取它时,它将创建一个副本 - 所以修改它将没有任何好处。鉴于您的意见,您可能会对C#中值类型和引用类型的工作方式感到困惑,在这种情况下,我建议您阅读我的article on the topic(或书籍或MSDN等)。
您需要获取它,修改副本,然后替换列表中的值:
var copy = list[index];
copy.a = 5;
list[index] = copy;
但是,我强烈建议不要首先创建可变值类型,部分原因是它们导致了这类问题。值类型通常应该用于更多“基本”值,这些值不能在适当的位置更改。改变“数字5”的含义是没有意义的,例如,“1月1日上午10点”。如果你改变了意思,你就会得到一个新值 - 所以强迫它真正 一个新值。
目前还不清楚(由于缺乏上下文)是否应该创建不可变值类型并在列表中替换它,或者创建可变引用类型(类)。或者甚至可能是不可变的引用类型,因为它通常有助于提高可读性。
我还建议不要使用公共字段 - use properties instead来将实现细节与类型的API分开。
答案 1 :(得分:2)
试试这个:
m1 temp ;
for (int counter = 0; counter < mList.size(); counter++)
{
temp = mList[counter];
temp.a = 5;
mList[counter] = temp
}
答案 2 :(得分:1)
如果您对使用struct而不使用临时变量感兴趣: 使用结构集合:
m1[] mList = new m1[100];
//initialize 100 items
for (int i = 0; i < 100; i++)
{
mList[i].a = 5;
}