"至少有一个对象必须实现IComparable"对于INT?据我所知,确实如此

时间:2012-09-21 21:06:27

标签: c# asp.net-mvc icomparable

好的,我有一个简单的IEnumerable<HtmlString> things,我想把它分成四个相等的组。

var quarter = things.Count() / 4;

应该做的伎俩,但我得到这个funkiness:

  '/'应用程序中的服务器错误。必须实现至少一个对象   IComparable的。描述:期间发生了未处理的异常   执行当前的Web请求。请查看堆栈跟踪   有关错误及其来源的更多信息   代码。

     

异常详细信息:System.ArgumentException:必须至少有一个对象   实施IComparable。

     

第36行:int quarter = things.Count()/ 4;

任何人都知道这里到底发生了什么事吗?为什么我需要实现IComparable才能获得简单的计数?

1 个答案:

答案 0 :(得分:20)

我的猜测是,这与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()