Короткий вопрос: как изменить отдельные элементы в List
? (точнее, члены a 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 ".
a, это ограничение не имеет смысла; не является ли первичное использование конструкции foreach?
b (также из злости), что делает Clear(), если не изменить список? (BTW, List удаляется, согласно отладчику, если я удаляю последнюю строку и запускаю ее.)
Итак, я попытался использовать другой подход и посмотреть, работает ли он с использованием регулярного цикла. (По-видимому, это допустимо только потому, что 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] ", потому что это не переменная". Тьфу! Что это, если не переменная? и когда он стал "возвращаемым значением"?
Я знаю, что должен быть "правильный" способ сделать это; Я прихожу к этому с фона C, и я знаю, что могу сделать это на C (хотя и с небольшим количеством ручного управления памятью.)
Я искал вокруг, и кажется, что ArrayList
вышел из моды в пользу общих типов (я использую 3.0), и я не могу использовать массив, так как размер должен быть динамическим.