Функция Linq .Except По крайней мере один объект должен реализовывать IComparable.

В основном у меня есть контейнер, который реализует IEquatable (пример показан ниже)

public class ContainerClass  : IEquatable<ContainerClass>
{
        public IEnumerable<CustomClass> CustomClass { get; set; }

        public override bool Equals(object obj) { ... }
        public bool Equals(ContainerClass other) { ... }
        public static bool operator ==(ContainerClass cc1, ContainerClass cc2) { ... }
        public static bool operator !=(ContainerClass cc1, ContainerClass cc2) { ... }
        public override int GetHashCode() { ... }
}

и CustomClass, который также реализует IEquatable

public class CustomClass : IEquatable<CustomClass>
{
        public string stringone { get; set; }
        public string stringtwo { get; set; }

        public override bool Equals(object obj) { ... }
        public bool Equals(CustomClass other) { ... }
        public static bool operator ==(CustomClass cc1, CustomClass cc2) { ... }
        public static bool operator !=(CustomClass cc1, CustomClass cc2) { ... }
        public override int GetHashCode() { ... }
}

Все это работает нормально, так например работает следующее

IEnumerable<CustomClass> customclassone = new List<CustomClass>
    {
        new CustomClass { stringone = "hi" },
        new CustomClass { stringone = "lo" }
    };
IEnumerable<CustomClass> customclasstwo = new List<CustomClass>
    {
        new CustomClass { stringone = "hi" }
    };

var diff = customclassone.Except(customclasstwo);

ContainerClass containerclassone = new ContainerClass 
{
    CustomClass = customclassone.AsEnumerable()
};
ContainerClass containerclasstwo = new ContainerClass 
{
    CustomClass = customclasstwo.AsEnumerable()
};

var diff2 = containerclassone.CustomClass.Except(customclasstwo.CustomClass);

После этого кода и diff, и diff2 при перечислении содержат ожидаемые результаты. Однако, если я попытаюсь

IEnumerable<CustomClass> oldCustom = oldContainerClass.CustomClass;
IEnumerable<CustomClass> newcustom = newContainerClass.CustomClass;
var exceptlist = oldCustom.Except(newcustom);

Когда я пытаюсь перечислить список исключений, я получаю «По крайней мере один объект должен реализовывать IComparable». Единственное отличие между oldCustom и newCustom от приведенных выше рабочих примеров заключается в способе их заполнения. Кто-нибудь понял, почему это происходит?


person Manatherin    schedule 14.01.2011    source источник
comment
Если вы не возражаете, я немного сократил код, чтобы нам не пришлось долго прокручивать его, чтобы прочитать.   -  person Jeff Mercado    schedule 14.01.2011
comment
Не могли бы вы предоставить код для oldContatinerClass и newContatinerCalss?   -  person Jahan    schedule 14.01.2011
comment
Можете ли вы составить короткую, но полную программу, демонстрирующую проблему? Я не понимаю, почему это произошло только из кода, который вы показали. (Вам не нужны операторы == и !=, чтобы продемонстрировать это.)   -  person Jon Skeet    schedule 14.01.2011


Ответы (1)


Я подозреваю, что вы пытались отсортировать это содержимое файла ContainerClass.CustomClass. Из-за отложенного выполнения вы не знаете, что есть проблема, пока не выполните итерацию, а Except() — это просто отвлекающий маневр. CustomClass не реализует интерфейс IComparable, поэтому сортировка завершается ошибкой. Ваш CustomClass должен либо реализовать интерфейс IComparable<T>, либо вы должны передать IComparer на свой OrderBy().

e.g.,

oldContainerClass.CustomClass = someListOfSomeType.OrderBy(x => x.CustomClasss, myComparer)
                                                  .Select(x => x.CustomClass);

Хотя было бы полезно увидеть, что именно вы присвоили этим свойствам, чтобы мы могли указать вам более точную причину.

person Jeff Mercado    schedule 14.01.2011
comment
Вы, наверное, правы... За исключением того, что IComparable все равно не нужен - person Thomas Levesque; 14.01.2011
comment
Чувак, я тупой, ты прав, один из моих хэш-кодов для переменной в CustomClass пытался упорядочить, но без компаратора - person Manatherin; 14.01.2011