Ritesh Koul Ответов: 1

Выполнять приказ без реализации интерфейса icomparable потому что вопрос по крайней мере один объект должен реализовывать интерфейс icomparable


У меня есть список класса " персона` как

var list = список<персона>();

Я хочу упорядочить список в порядке убывания на основе " PersonId`

var newlist = список.OrderByDescending(x => x.PersonId).Список();

Класс "Person" создается какой-то другой командой, и я не хочу менять класс, реализуя "IComparable".

Есть ли какой-нибудь способ, которым я могу использовать order by, не реализуя "IComparable"?

Кто-нибудь поможет?

Что я уже пробовал:

var newlist = список.OrderByDescending(x => x.PersonId).Список();

F-ES Sitecore

Ваш код должен работать, вам не нужен человек, чтобы реализовать IComparable.

1 Ответов

Рейтинг:
0

OriginalGriff

Проблема не в классе Person, а в типе PersonId: если он целочисленный, это будет работать нормально:

class Program
    {
    static void Main(string[] args)
        {
        var list = new List<Person>();
        list.Add(new Person(){PersonId = 3});
        list.Add(new Person(){PersonId = 7});
        list.Add(new Person(){PersonId = 9});
        list.Add(new Person(){PersonId = 42});
        var newlist = list.OrderByDescending(x => x.PersonId).ToList();
        Console.ReadLine();
        }
    }
class Person
    {
    public int PersonId {get; set; }
    }
Но если PersonId не является IComparable, то нет никакого реального способа убедиться в правильности упорядочения, кроме как организовать компаратор. Но даже такой ошибки вы не получите:
class Program
    {
    static void Main(string[] args)
        {
        var list = new List<Person>();
        list.Add(new Person(){PersonId = 3});
        list.Add(new Person(){PersonId = 7});
        list.Add(new Person(){PersonId = 9});
        list.Add(new Person(){PersonId = 42});
        var newlist = list.OrderByDescending(x => x.p).ToList();
        Console.ReadLine();
        }
    }
class Person
    {
    public int PersonId {get; set; }
    public Person p { get; set; }
    }
}
Скорее всего, вы получите тот же самый заказ, с которого начали.