2010-10-09 5 views
2

J'ai une liste définie comme ça ...Trier la liste par propriété/fonction anonyme?

var sets = new List<HashSet<int>>(numSets); 

Pourquoi pas là une surcharge donc je peux trier comme ça?

sets.Sort(s => s.Count); 

Je veux le plus grand ensemble en premier. Quelle est la meilleure façon de faire cela?

Répondre

6

Parce que la classe List<T> a été introduite dans .NET 2.0 et les concepteurs de cette classe l'ont décidé. Vous pouvez utiliser la méthode d'extension OrderByDescending:

sets = sets.OrderByDescending(s => s.Count).ToList(); 
+0

Cela va trier dans l'ordre croissant. L'OP veut le plus grand ensemble en premier. Vous avez besoin de 'OrderByDescending'. – Ani

+0

@Ani, correct. J'ai mis à jour mon message pour refléter cela. Merci de l'avoir signalé. –

+0

Les deux solutions ont l'air bien ... Je vais attendre pour voir qui obtient plus de voix avant de choisir: P Merci! J'aime comme c'est facile à lire. – mpen

4

Essayez ceci:

sets.Sort((setA, setB) => setB.Count.CompareTo(setA.Count)); 

Il utilise la surcharge Sort(Comparison<T> comparison) de List<T>.Sort. Le fait que l'expression compare B à A plutôt qu'à A avec B est ce qui produit l'ordre décroissant par comptage dont vous avez besoin.

La raison pour laquelle votre code ne fonctionne pas est parce que List<T>.Sort, à la différence Enumerable.OrderByDescending, n'a pas une surcharge qui accepte un Func<TSource, TKey>-sélecteur à clé.

La technique de @Darin Dimitrov d'utiliser OrderByDescending est très bien aussi, mais notez que cela va créer une liste triée hors de propos et réaffecter la référence que vous avez à la liste d'origine à la nouvelle, triée.

+0

Oh ... donc il y a une surcharge de fonction anonyme. J'ai vu cette chose 'Comparison <>', mais je ne savais pas ce que c'était. – mpen

+0

Réaffecter est bien ... mais qui est plus efficace? Je devinerais celui-ci parce qu'il le fait sur place. OTH, son lit ressemble plus à l'anglais. – mpen

+0

@Mark: L'un * devrait * être plus efficace. Bien sûr, la seule façon de le savoir est de mesurer. Je suis d'accord avec vous sur le point de lisibilité. Pour tirer le meilleur parti des deux solutions, vous pouvez envisager d'écrire une méthode d'extension pour 'List ' avec un paramètre key-selector. – Ani