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), и я не могу использовать массив, так как размер должен быть динамическим.