c# modifiant les structures dans une Liste<T>

Petite question: Comment puis-je modifier des éléments individuels dans une List? (ou, plus précisément, les membres d'un struct stockées dans un List?)

Explication complète:

Tout d'abord, le struct définitions des termes utilisés ci-dessous:

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 est renseigné sur la charge, et ainsi de suite jusqu'à la ligne comme le programme s'exécute.

Le problème se pose lorsque je veux trier les itemInfo objets dans le subItems tableau.
Je suis à l'aide de LINQ pour ce faire (car il ne semble pas y avoir d'autre moyen raisonnable de trier les listes de non-intégré-type).
Alors, voici ce que j'ai:

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
}

De l'erreur "Impossible de modifier les membres de la "sInf" parce que c'est un "foreach variable d'itération'".

un, cette restriction n'a pas de sens; ce n'est pas l'utilisation principale de la structure foreach?

b (de dépit) qu'est-Clear() faire si pas de modifier la liste? (BTW, la Liste est effacée, selon le débogueur, si je supprime la dernière ligne et de l'exécuter.)

J'ai donc essayé de prendre une approche différente, et voir si cela a fonctionné, à l'aide d'un régulier pour la boucle. (Apparemment, c'est uniquement autorisée parce que gAllCats[c].items est en fait un IList; je ne pense pas que cela va vous permettre d'index régulièrement List de cette façon.)

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
}

Cette fois, l'erreur est "Impossible de modifier la valeur de retour de 'Système.Les Collections.Génériques.IList.cette[int] " parce qu'il n'est pas une variable." Pouah! Qu'est-ce, si ce n'est une variable? et quand est-elle devenue une "valeur de retour'?

Je sais qu'il y a à être une "bonne" façon de le faire; je viens à ce à partir d'un C en arrière-plan et je sais que je pourrais le faire en C (mais avec un bon morceau de manuel de gestion de la mémoire.)

J'ai cherché partout, et il semble que ArrayList a passé de mode en faveur de types génériques (je suis en utilisant 3.0) et je ne peux pas utiliser un tableau de la taille doit être dynamique.

OriginalL'auteur andersop | 2009-07-01