Similaire à List <> OrderBy Alphabetical Order , nous voulons trier par un élément, puis un autre. nous voulons atteindre l'équivalent fonctionnel de
SELECT * from Table ORDER BY x, y
Nous avons une classe qui contient un certain nombre de fonctions de tri et nous n'avons aucun problème à trier par un élément.
Par exemple:
public class MyClass {
public int x;
public int y;
}
List<MyClass> MyList;
public void SortList() {
MyList.Sort( MySortingFunction );
}
Et nous avons les éléments suivants dans la liste:
Unsorted Sorted(x) Desired
--------- --------- ---------
ID x y ID x y ID x y
[0] 0 1 [2] 0 2 [0] 0 1
[1] 1 1 [0] 0 1 [2] 0 2
[2] 0 2 [1] 1 1 [1] 1 1
[3] 1 2 [3] 1 2 [3] 1 2
Un tri stable serait préférable, mais pas obligatoire. La solution qui fonctionne pour .Net 2.0 est la bienvenue.
Réponses:
Gardez à l'esprit que vous n'avez pas besoin d'un tri stable si vous comparez tous les membres. La solution 2.0, comme demandé, peut ressembler à ceci:
Notez que cette solution 2.0 est toujours préférable à la solution 3.5 Linq populaire, elle effectue un tri sur place et n'a pas l'exigence de stockage O (n) de l'approche Linq. À moins que vous ne préfériez bien sûr que l'objet List d'origine reste intact.
la source
Pour les versions de .Net où vous pouvez utiliser LINQ
OrderBy
etThenBy
(ouThenByDescending
si nécessaire):Remarque: pour .Net 2.0 (ou si vous ne pouvez pas utiliser LINQ) voir la réponse de Hans Passant à cette question.
la source
Vous devez implémenter l' interface IComparer . Voici un bon article avec un exemple de code.
la source
L'astuce consiste à implémenter un tri stable. J'ai créé une classe Widget qui peut contenir vos données de test:
J'ai implémenté IComparable, donc il peut être trié de manière instable par List.Sort ().
Cependant, j'ai également implémenté la méthode statique Compare, qui peut être transmise en tant que délégué à une méthode de recherche.
J'ai emprunté cette méthode de tri par insertion à C # 411 :
Vous mettriez cela dans la classe des aides au tri que vous avez mentionnée dans votre question.
Maintenant, pour l'utiliser:
Et il sort:
Cela pourrait probablement être nettoyé avec des délégués anonymes, mais je vous laisse le soin.
EDIT : Et NoBugz démontre la puissance des méthodes anonymes ... alors, considérez la mienne plus oldschool: P
la source
Cela peut vous aider, Comment trier la liste générique C #
la source
J'ai eu un problème où OrderBy et ThenBy ne m'ont pas donné le résultat souhaité (ou je ne savais tout simplement pas comment les utiliser correctement).
Je suis allé avec une solution list.Sort quelque chose comme ça.
la source