1

代码是:

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

但它失败了。因为在 for each 我在控制台上写了 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;
    }

它也没有用。我尽我所能以及我在互联网和这个网站上找到的一切。您能否帮助您找到一种方法来访问列表中对象(结构类型)的参数?显然,当列表由对象(来自类)组成时很容易。如果我想从结构的对象中创建一个列表,那就很复杂了。任何帮助都将受到高度欢迎。

4

3 回答 3

10

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

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

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

但是,我强烈建议不要首先创建可变值类型,部分原因是它们恰好会导致此类问题。值类型通常应该用于无法就地更改的更多“基本”值。例如,更改“数字 5”或“1 月 1 日上午 10 点”的含义是没有意义的。如果你改变了意义,你就有了一个新的价值——所以强迫它真正成为一个新的价值。

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

我还建议不要使用公共字段 -改用属性,将实现细节与类型的 API 分开。

于 2012-08-26T08:39:56.623 回答
2

试试这个:

m1 temp ;
for (int counter = 0; counter < mList.size(); counter++)
    {
        temp = mList[counter];
        temp.a = 5;
        mList[counter] = temp
    }
于 2012-08-26T08:42:57.343 回答
1

如果您有兴趣在不使用临时变量的情况下使用 struct:使用 struct 集合:

           m1[] mList = new m1[100];
            //initialize 100 items

            for (int i = 0; i < 100; i++)
            {
                mList[i].a = 5;
            }
于 2012-08-26T09:00:18.320 回答