2012-09-21 29 views
7

Ok, ich habe eine einfache IEnumerable<HtmlString> things und ich möchte es in vier gleiche Gruppen aufteilen."Mindestens ein Objekt muss IComparable für ein INT implementieren?" Soweit ich weiß, tut es

var quarter = things.Count()/4; 

sollte es tun, sondern erhalte ich diese funkiness:

Serverfehler in der Anwendung '/'. Mindestens ein Objekt muss IComparable implementieren. Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie den Stack-Trace für weitere Informationen über den Fehler und wo es aus dem Code stammt.

Ausnahmedetails: System.ArgumentException: Mindestens ein Objekt muss IComparable implementieren.

Zeile 36: int viertel = dinge.Count()/4;

Wer weiß, was zum Teufel hier los ist? Warum sollte ich IComparable implementieren, um eine einfache Zählung zu erhalten?

+1

Bitte senden Sie den vollständigen Stack-Trace. Meine Vermutung ist, dass Sie faul sortieren gehen ... –

Antwort

20

Meine Vermutung ist, dass dies mit faulen Bewertung von LINQ OrderBy zu tun hat. Zum Beispiel, wenn Sie haben:

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

dann, wenn die foo.Bar Eigenschaften nicht miteinander verglichen werden können, wird diese wirft genau diese Ausnahme.

Zum Beispiel:

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()); 
    } 
} 

Ausgang:

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

Richtig du bist, mein Freund. Ich entfernte die .OrderBy() und alles funktioniert wie angekündigt. Danke noch einmal. –

+0

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