访问列表c#中的对象

代码是:

struct m1 { public int a; public int b; } int main() { List  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)的参数吗? 显然,当列表来自对象(来自类)时,它很容易。 如果我想从结构对象中创建一个列表,那就会出现复杂化。 任何帮助都会受到欢迎。

问题是你已经在一个列表中放置了一个结构 。 当您从列表中获取它时,将创建一个副本 – 因此修改它将不会有任何好处。 鉴于您的意见,您可能会对C#中值类型和引用类型的工作方式感到困惑,在这种情况下,我建议您阅读有关该主题 (或书籍或MSDN等)的文章。

您需要获取它,修改副本,然后替换列表中的值:

 var copy = list[index]; copy.a = 5; list[index] = copy; 

但是,我强烈建议不要首先创建可变值类型,部分原因是它们确实导致了这类问题。 值类型通常应该用于更多“基本”值,这些值不能在适当的位置更改。 改变“5号”的含义是没有意义的,例如,“1月1日上午10点”。 如果你改变了意思,你就会得到一个新的价值 – 所以强迫它真正成为一个新的价值。

目前还不清楚(由于缺乏上下文)是否应该创建一个不可变值类型并在列表中替换它,或者创建一个可变引用类型(类)。 或者甚至可能是不可变的引用类型,因为它通常有助于提高可读性。

我还建议不要使用公共字段 – 而是使用属性来将实现细节与类型的API分开。

试试这个:

 m1 temp ; for (int counter = 0; counter < mList.size(); counter++) { temp = mList[counter]; temp.a = 5; mList[counter] = temp } 

如果你有兴趣使用struct而不使用临时变量:使用struct集合:

  m1[] mList = new m1[100]; //initialize 100 items for (int i = 0; i < 100; i++) { mList[i].a = 5; }