8

OK、私は単純なものを持っていIEnumerable<HtmlString> thingsます。それを 4 つの等しいグループに分割したいと思います。

var quarter = things.OrderBy(t => t.Foo).Count() / 4;

トリックを行う必要がありますが、代わりにこのファンキーさが得られます:

「/」アプリケーションでサーバー エラーが発生しました。少なくとも 1 つのオブジェクトが IComparable を実装する必要があります。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.ArgumentException: 少なくとも 1 つのオブジェクトが IComparable を実装する必要があります。

36 行目: int Quarter = things.OrderBy(t => t.Foo).Count() / 4;

ここで何が起こっているのか知っている人はいますか?単純なカウントを取得するために IComparable を実装する必要があるのはなぜですか?

4

1 に答える 1

22

私の推測では、これは LINQ の遅延評価に関係していると思われますOrderBy。たとえば、次の場合:

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

foo.Barプロパティを互いに比較できない場合は、まさにその例外がスローされます。

例えば:

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

出力:

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()
于 2012-09-21T21:13:39.230 に答える