2012-09-21 60 views
7

Ok, tengo un simple IEnumerable<HtmlString> things y quiero dividirlo en cuatro grupos iguales."Al menos un objeto debe implementar IComparable" para un INT? Por lo que sé, hace

var quarter = things.Count()/4; 

debe hacer el truco, pero en lugar de eso obtener esta peculiaridad:

Error de servidor en la aplicación '/'. Al menos un objeto debe implementar IComparable. Descripción: Ocurrió una excepción no controlada durante la ejecución de la solicitud web actual . Revise el seguimiento de pila para obtener más información sobre el error y dónde se originó en el código .

Detalles de la excepción: System.ArgumentException: Al menos un objeto debe implementar IComparable.

Línea 36: int quarter = things.Count()/4;

¿Alguien sabe qué diablos está pasando aquí? ¿Por qué tendría que implementar IComparable para obtener un conteo simple?

+1

Por favor enviar la traza completa. Supongo que tienes una clasificación floja ... –

Respuesta

20

Supongo que esto tiene que ver con la evaluación perezosa de LINQ's OrderBy. Por ejemplo, si usted tiene:

var things = unsortedThings.OrderBy(foo => foo.Bar); 
var quarter = things.Count()/4; 

entonces, si los foo.Bar propiedades no pueden ser comparados entre sí, que va a tirar exactamente eso excepción.

Por ejemplo:

using System; 
using System.Linq; 

class Foo {} 

class Program 
{ 
    public static void Main() 
    { 
     var foos = new[] { new Foo(), new Foo() }; 
     var ordered = foos.OrderBy(x => x); 
     Console.WriteLine(ordered.Count()); 
    } 
} 

Salida:

Unhandled Exception: System.ArgumentException: At least one object must implement IComparable. 
    at System.Collections.Comparer.Compare(Object a, Object b) 
    at System.Linq.EnumerableSorter`2.CompareKeys(Int32 index1, Int32 index2) 
    at System.Linq.EnumerableSorter`1.QuickSort(Int32[] map, Int32 left, Int32 right) 
    at System.Linq.EnumerableSorter`1.Sort(TElement[] elements, Int32 count) 
    at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext() 
    at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source) 
    at Program.Main() 
+0

Tienes razón, amigo mío. Eliminé .OrderBy() y todo funciona según lo anunciado. Gracias de nuevo. –

+0

duplicado de http://stackoverflow.com/questions/14141891/at-least-one-object-must-implement-icomparable –

Cuestiones relacionadas