c#修改列表中的结构体

短问题:如何修改列表中的单个项目? (或更准确地说,存储在列表中的结构的成员)

完全解释:

首先,下面使用的结构定义如下:

public struct itemInfo
{
    ...(Strings, Chars, boring)...
    public String nameStr;
    ...(you get the idea, nothing fancy)...
    public String subNum;   //BTW this is the element I'm trying to sort on
}

public struct slotInfo
{
    public Char catID;
    public String sortName;
    public Bitmap mainIcon;
    public IList<itemInfo> subItems;
}

public struct catInfo
{
    public Char catID;
    public String catDesc;
    public IList<slotInfo> items;
    public int numItems;
}

catInfo[] gAllCats = new catInfo[31];

gAllCats在加载时进行填充,并在程序运行时按顺序排列.

当我想对子项数组中的itemInfo对象进行排序时,会出现此问题.
我正在使用LINQ来执行此操作(因为似乎没有任何其他合理的方式排序非内置类型的列表).
所以这就是我所拥有的:

foreach (slotInfo sInf in gAllCats[c].items)
{
    var sortedSubItems =
        from itemInfo iInf in sInf.subItems
        orderby iInf.subNum ascending
        select iInf;
    IList<itemInfo> sortedSubTemp = new List<itemInfo();
    foreach (itemInfo iInf in sortedSubItems)
    {
        sortedSubTemp.Add(iInf);
    }
    sInf.subItems.Clear();
    sInf.subItems = sortedSubTemp;   // ERROR: see below
}

错误是“无法修改’sInf’的成员,因为它是一个’foreach迭代变量’.

a,这个限制没有意义;这不是foreach构造的主要用途吗?

b,(也是出于错误)Clear()做什么,如果不修改列表? (BTW,根据调试器,列表确实被清除,如果我删除最后一行并运行它).

所以我试图采取一种不同的方法,看看它是否使用一个常规的循环. (显然,这只是允许的,因为gAllCats [c] .items实际上是一个IList;我不认为它会允许你以这种方式索引一个常规列表.)

for (int s = 0; s < gAllCats[c].items.Count; s++)
{
    var sortedSubItems =
        from itemInfo iInf in gAllCats[c].items[s].subItems
        orderby iInf.subNum ascending
        select iInf;
    IList<itemInfo> sortedSubTemp = new List<itemInfo>();
    foreach (itemInfo iInf in sortedSubItems)
    {
        sortedSubTemp.Add(iInf);
    }
    //NOTE: the following two lines were incorrect in the original post
    gAllCats[c].items[s].subItems.Clear();
    gAllCats[c].items[s].subItems = sortedSubTemp;   // ERROR: see below
}

这一次,错误是“不能修改’System.Collections.Generic.IList.this [int]’的返回值,因为它不是一个变量.啊!这是什么,如果不是变量?什么时候成为“回报价值”?

我知道必须有一个“正确”的方式来做到这一点;我从C的背景来到这里,我知道我可以在C(尽管手动内存管理很好).

我搜索了,似乎ArrayList已经脱离了泛型类型(我使用3.0),我不能使用数组,因为大小需要是动态的.

看一下for循环方法,这个原因(和解决方案)在documentation for the compilation error中给出:

An attempt was made to modify a value
type that is produced as the result of
an intermediate expression but is not
stored in a variable. This error can
occur when you attempt to directly
modify a struct in a generic
collection.

To modify the struct, first assign it
to a local variable, modify the
variable, then assign the variable
back to the item in the collection.

因此,在for循环中,更改以下行:

catSlots[s].subItems.Clear();
catSlots[s].subItems = sortedSubTemp;   // ERROR: see below

…到:

slotInfo tempSlot = gAllCats[0].items[s];
tempSlot.subItems  = sortedSubTemp;
gAllCats[0].items[s] = tempSlot;

我删除了对Clear方法的调用,因为我不认为它增加了任何东西.

http://stackoverflow.com/questions/1067340/c-sharp-modifying-structs-in-a-listt

转载注明原文:c#修改列表中的结构体