2009-11-01 7 views
29

J'ai un List<T>T est une classe qui expose une propriété "Nom d'utilisateur". Le nom d'utilisateur est d'un type personnalisé qui encapsule une chaîne. Je mis en œuvre l'interface IComparable<T> sur ce type personnalisé qui retourne simplementEchec de la comparaison de deux éléments dans le tableau

this.encapsulatedString.CompareTo(other.encapsulatedString) 

Je définis une ICollectionView de la liste ainsi:

AllUsers=CollectionViewSource.GetDefaultView(myList); 

J'ai ajouté un SortDescription:

AllUsers.SortDescriptions.Add(new SortDescription("Username",ListSortDirection.Ascending)); 

Sur cette ligne le code jette l'exception indiquée dans le titre. Je peux trier la liste par d'autres moyens sans problème. D'où vient l'exception?

Répondre

46

Stupidstupidstupid: Le type personnalisé doit mettre en œuvre IComparable ainsi que IComparable<T> Il semble que le SortDescription utilise l'ancienne version non générique de CompareTo

Je vais aller dormir bien nécessaire ...

+0

N'hésitez pas à clôturer votre question si vous le souhaitez ... – Noldorin

+37

NON, ne fermez pas. Quelqu'un d'autre pourrait rencontrer le même problème – erikkallen

+4

+1 Ouais comme moi ... merci de le garder ouvert. :-) –

0

Comme vous l'avez dit, vous devez implémenter le IComparable non générique. Vous pouvez utiliser la classe Comparer <T> si vous souhaitez implémenter cette interface d'une manière générique sympa :)

4

votre réponse n'est pas strictement correcte d'après ce que je peux dire. Mes objets n'implémentent pas IComarable ou IComparable et ils fonctionnent toujours bien. Je crée une CollectionViewSource et j'ajoute des descriptions de tri comme vous et je n'ai pas cette erreur. Je recevais l'erreur parce que la propriété dans la description de tri était vide. Une fois que j'ai réparé tout cela a bien fonctionné sans l'interface. Je suppose que vous avez peut-être une propriété incorrecte et elle retombe en utilisant IComparable si elle ne peut pas accéder à la propriété.

5

Dans mon cas, j'ai ajouté un bloc try/catch dans la fonction Compare, et j'ai affiché le message d'exception à la console. S'il y a un bug dans votre fonction de comparaison, vous obtiendrez cette exception secondaire ("Impossible de comparer deux éléments ..."). Mon problème était spécifiquement avec l'indexation à la position 3 d'une chaîne qui était "" en raison d'un autre bogue.

+1

Pour moi cela a également été causé par une exception dans la fonction de comparaison. –

0

Dans mon cas, la propriété en cours de tri était object, et l'erreur se produisait lorsque certains des objets étaient int s et d'autres étaient string s.

je aurais pu IComparable mis en œuvre, mais l'utilisation de la classe était vraiment plus adaptée chaîne - j'ai pu changer object-string, et assurez-vous que tous les setters en utilisant les numéros appelés .ToString(), et il était prêt à partir de là .

Questions connexes