c # изменение структур в списке <T>

Короткий вопрос: как я могу изменить отдельные элементы вList? (или, точнее, членыstruct хранится вList?)

Полное объяснение:

Во-первых,struct определения, используемые ниже:

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 объекты вsubItems массив. Я использую для этого 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».

а, это ограничение не имеет смысла; разве это не первичное использование конструкции foreach?

b, (также не зря), что делает Clear (), если не изменяет список? (Кстати, список очищается, по словам отладчика, если я удалю последнюю строку и запусту ее.)

Поэтому я попытался использовать другой подход и посмотреть, работает ли он, используя обычный цикл for. (Видимо, это допустимо только потому, чтоgAllCats[c].items на самом делеIList; Я не думаю, что это позволит вам индексировать регулярныеList сюда.)

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] & apos; потому что это не переменная. & quot; Тьфу! Что это, если не переменная? и когда он стал «возвращаемым значением»?

Я знаю, что должен быть «правильный» способ сделать это; Я пришел к этому из C-фона, и я знаю, что мог бы сделать это в C (хотя и с хорошим ручным управлением памятью.)

Я искал вокруг, и кажется, чтоArrayList вышла из моды в пользу универсальных типов (я использую 3.0), и я не могу использовать массив, так как размер должен быть динамическим.

Ответы на вопрос(5)

Ваш ответ на вопрос