"Хотя бы один объект должен реализовать IComparable" для INT? Насколько мне известно, так оно и есть.


Хорошо, у меня есть простой IEnumerable<HtmlString> things, и я хочу разделить его на четыре равные группы.

var quarter = things.Count() / 4;

Должен сделать трюк, но вместо этого я получаю эту фанкность:

Ошибка сервера в приложении'/'. По крайней мере один объект должен реализовать Интерфейс icomparable. Описание: необработанное исключение произошло во время выполнение текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в код.

Исключение Детали: Система.ArgumentException: по крайней мере один объект должен реализовать IComparable.

Строка 36: int quarter = вещи.Граф() / 4;

Кто-нибудь знает, какого черта здесь происходит? Зачем мне нужно реализовать IComparable, чтобы получить простой счетчик?

1 7

1 ответ:

Я предполагаю, что это связано с ленивой оценкой LINQ'S 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()