访问列表c#中的对象

时间:2012-08-26 08:31:42

标签: c# list struct

代码是:

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

3 个答案:

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