2009-11-01 11 views
29

Tengo un List<T> donde T es una clase que expone una propiedad de "Nombre de usuario". El nombre de usuario es de un tipo personalizado que encapsula una cadena. He implementado la interfaz IComparable<T> en este tipo personalizado que simplemente devuelveError al comparar dos elementos en el conjunto

this.encapsulatedString.CompareTo(other.encapsulatedString) 

que define una ICollectionView de la lista así:

AllUsers=CollectionViewSource.GetDefaultView(myList); 

he añadido un Sortdescription:

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

En esta línea el código arroja la excepción establecida en el título. Puedo ordenar la lista por otros medios sin problema. ¿De dónde viene la excepción?

Respuesta

46

Stupidstupidstupid: El tipo personalizado tiene que implementar IComparable, así como IComparable<T> Parece que la SortDescription utiliza la antigua versión no genérica de moda CompareTo

voy a dormir muy necesario ...

+0

No dude en cerrar su pregunta si lo desea ... – Noldorin

+37

NO, no cierre. Alguien más podría encontrarse con el mismo problema – erikkallen

+4

+1 Sí, como yo ... gracias por mantenerlo abierto. :-) –

0

Como dijiste, necesitas implementar el IComparable no genérico. Puede utilizar la clase Comparer <T> si desea implementar esta interfaz de una forma muy genérica :)

4

su respuesta no es estrictamente correcta por lo que puedo decir. Mis objetos no implementan IComarable o IComparable en absoluto y todavía funcionan bien. Estoy creando un CollectionViewSource y agregando descripciones de ordenación como tú y sin obtener este error. Recibí el error porque la propiedad en la descripción de clasificación estaba en blanco. Una vez que arreglé esto, todo funcionó bien sin la interfaz. Sospecho que tal vez tenía una propiedad incorrecta y que vuelve a utilizar IComparable si no puede acceder a la propiedad.

5

En mi caso, agregué un bloque try/catch dentro de la función Compare y mostré el mensaje de excepción a la consola. Si hay una falla dentro de su función de comparación, obtendrá esta excepción secundaria ("Error al comparar dos elementos ...").

Mi problema fue específicamente con la indexación de la posición 3 de una cadena que era "" debido a otro error.

+1

Para mí, esto también fue causado por una excepción dentro de la función Comparar. –

0

En mi caso, la propiedad que se ordenó fue object, y el error se produjo cuando algunos de los objetos eran int sy otros string s.

que podría haber implementado IComparable, pero el uso de la clase estaba realmente más hilo orienta - yo era capaz de cambiar object a string, y asegúrese de que todos los emisores de llamadas usando números .ToString(), y estaba todo preparado a partir de ahí .