7
votes

Tri de la liste <> avec mon ordre personnalisé qui est stocké dans une autre liste (C #)?

Quelqu'un peut-il aider .. J'ai une liste générique comme si SO

       IList<itemTp>


0 commentaires

3 Réponses :


0
votes

désolé si quelque chose ne va pas, je n'ai pas d'éditeur C # installé ici, mais c'est quelque chose comme ça:

 Array.Sort(
     itemTps, 
     delegate(ItemTp a, ItemTp b)
     {
          return secondList.IndexOf(a.Code) - secondList.IndexOf(b.Code);
     });


1 commentaires

Oui .. Je pensais seulement au comparateur. Ici, c'est: Stackoverflow.com/questions/15486/sorting-an-ilist-in-c < / a>



9
votes

Vous devrez créer un IComparer qui comparera les éléments basés sur l'état de votre autre liste. L'avantage de l'utilisation d'un ICOMPARER est que vous pourrez créer la logique de mise en cache dans votre classe afin d'éviter les recherches répétées () de cette optimisation. De plus, vous serez en mesure de conserver plusieurs "autres" listes pouvant être utilisées le cas échéant.

myList.Sort(new ItemTpComparer(otherList));


5 commentaires

Je ne dirais pas qu'il y a un avantage. Vous pouvez transmettre le délégué à une méthode d'instance de la même manière que vous transmettez l'interface et que vous avez une logique que vous souhaitez là-bas.


Cela a l'air génial, juste une question, vous passez A et B dans l'index de sur une autre partie ... Alors, que se passerait-il si j'avais "TestMenow" et "TestMelater" .. Indexof va retourner 6 pour chacun non ??


Je ne comprends pas votre commentaire. Si le testMenow et le testMater sont dans une autre liste, ils ne peuvent pas être à l'index 6.


@Groo: Vous pouvez avoir une logique que vous voulez là-bas, true, mais vous devez définir un dictionnaire en dehors de votre bloc de délégué pour contenir des valeurs mises en cache, etc. Définition d'un ICOMPARER vous permet d'encapsuler cette logique dans une classe et de jouer le tri sera une ligne autonome ailleurs dans le code. Juste une question de préférence.


À propos, l'interface IList n'a pas de méthode de tri. Je ne sais pas si ce n'est pas un problème: le titre de la question indique la liste (qui a une méthode de tri) mais les exemples de la question utilisent IList .



0
votes

Utilisation C # 3 et Linq aux objets, je créerais simplement une nouvelle liste au lieu d'essayer de trier l'existant:

void Example()
{
    IList<string> codes;
    IList<ItemTp> itemTps;
    itemTps = codes.Select(code => itemTps.Single(itp => itp.Code == code)).ToList();
}


0 commentaires