2009-06-22 9 views
2

Actuellement, j'ai un objet implémentant l'interface IComparable (ASP.NET 3.5, VB). Lorsque je place plusieurs objets instanciés dans une liste générique, je les trier en faisant un simple someList.Sort. Ma fonction CompareTo() est la suivante:Utilisation de CompareTo() pour trier en fonction de plusieurs colonnes

Public Function CompareTo(ByVal obj As Object) As Integer Implements 
System.IComparable.CompareTo 
    'default is number of votes (opposite direction, highest first)' 
    Dim sent As Sentence = CType(obj, Sentence) 
    Return Not Points.CompareTo(sent.Points) 
End Function 

Cela fonctionne très bien, sauf que maintenant je dois trier par une autre propriété, la propriété DateSubmitted, comme un sous-ensemble des points. Par exemple, si trois phrases ont des votes: 3, 1, 1, je veux celui avec les plus hauts votes d'abord (évidemment) et des deux phrases avec une voix, celui qui a soumis le plus tôt pour être énuméré. Est-ce possible avec CompareTo(), ou devrais-je juste frapper à nouveau la base de données et le trier là?

Merci

Répondre

2

Puisque vous êtes sur .NET 3.5, vous pouvez trier selon la méthode d'extension OrderBy facilement:

Dim someSortedList = someList.OrderBy(Function(item) item.SomeColumn) _ 
          .ThenBy(Function(item) item.SomeOtherColumn) 
          .ToList() 

' OrderByDescending and ThenByDescending are also there for descending order 

Si vous devez frapper à nouveau ou non la base de données dépend de la façon dont vous avez données récupérées en premier lieu. Si vous avez un grand ensemble de données et que vous n'en avez récupéré qu'un petit sous-ensemble dans la base de données, vous devez simplement demander à la base de données de saisir un petit sous-ensemble de données basé sur le nouvel ordre de tri. Sinon, si vous avez déjà tout en mémoire, il suffit de le trier comme je l'ai mentionné ci-dessus.

+0

je ne peux pas obtenir someList.OrderBy pour apparaître dans l'intellisense ... je suis sûr que j'utilise 3.5 (j'utilise VS08), mais je suppose qu'il est possible que je ne suis pas? – Jason

+1

Avez-vous 'Imports System.Linq'? Assurez-vous qu'il existe un "" dans votre fichier Web.config. –

+0

ah! ok ... j'ai importé Linq ... que représente "item"? est-ce un objet instancié? – Jason

6

Votre fonction CompareTo() est incorrecte. Vous devez renvoyer des résultats corrects pour trois états (<, = et>), et votre Not signifie que la fonction ne gère correctement que deux d'entre eux. Ce causera des problèmes si vous appelez la fonction sur une liste assez grande.

Comme MehrdadA déjà mentionné, .Net 3.5 a une façon plus simple de le gérer. Mais voici comment le faire si pour une raison quelconque, vous ne pouvez pas gérer les expressions lambda:

Public Function CompareTo(Of Sentence)(ByVal obj As Sentence) As Integer _ 
    Implements System.IComparable.CompareTo(Of Sentence) 

    If obj Is Nothing Return 1 
    Dim result As Integer = Points.CompareTo(obj.Points) * -1 
    If result = 0 Then result = DateSubmitted.CompareTo(obj.DateSubmitted) 
    Return result 
End Function 

Notez que vous voulez maintenant mettre en œuvre IComparable(Of T), plutôt que IComparable.

+0

+1, merci ... je suis allé w/la solution linq, mais cela m'a aidé à comprendre CompareTo() – Jason

+0

+1 pour la capture de comparaison négative "-1". – Shimmy

Questions connexes