Неверный результат для списка сортировки с двумя элементами и преобразования в верхний регистр в C#

У меня есть класс person, который содержит id and name. И у меня есть список person. Я хочу sort the list by Id. Затем отсортируйте элементы с same ID by name и преобразуйте name to uppercase letters, и, наконец, повторяющиеся элементы будут удалены.

List<person> list = new List<person>();
list.Add(new person(112, "Bname"));
list.Add(new person(111, "Cname"));
list.Add(new person(112, "Aname"));
list.Add(new person(111, "Aname"));
list.Add(new person(114, "Aname"));

Желаемый результат:

111,ANAME
111,CNAME
112,ANAME
112,BNAME
114,ANAME

Мой код:

       for (int i = 0; i < list.Count - 1; i++)
        {

            if (list[i + 1].Id < list[i + 1].Id && string.Compare(list[i + 1].Name, list[i + 1].Name) > 0)
            { 
                person temp = list[i];
                list[i] = list[i + 1];
                list[i + 1] = temp;
                i = -1; //sort from lowest out of order index
            }
        }

        for (int i = 0; i < list.Count - 1; i++)
        {
            list[i].Name= list[i].Name.ToUpper();
            if (list[i] == list[i + 1])
                list.Remove(list[i + 1]);
        }

Но результат неверный. Кто-нибудь может мне помочь?

TTomer 10.01.2023 14:09

Когда вы говорите «повторяющиеся элементы удаляются», будут ли элементы с одинаковыми идентификаторами, но разными именами считаться дубликатами? Или они дублируются только в том случае, если совпадают имя и идентификатор? (Я спрашиваю, потому что немного странно иметь ситуацию, когда несколько элементов могут иметь один и тот же идентификатор...)

Matthew Watson 10.01.2023 16:02
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
2
2
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать все это легко с linq.

1- с помощью OrderBy(x => x.Id упорядочить список с идентификатором

2- используйте ThenBy(x=>x.Name) для сортировки по имени с одинаковым идентификатором

3- используя .Select(x=>new {Id=x.Id,Name= x.Name.ToUpper()}) для преобразования имени в верхний регистр

4- используя .Distinct() для удаления дубликатов

  var result=list.OrderBy(x => x.Id).ThenBy(x=>x.Name)
                 .Select(x=>new {Id=x.Id,Name= x.Name.ToUpper()}).Distinct().ToList();

Я думаю, что в вашем ответе есть две проблемы: во-первых, вы выбираете, что вы меняете ссылку на объекты, а второй метод не оптимизирован для памяти .Distinct(), поскольку его документы называют равными, и он не может сравнивать два определенных разработчиком объекта по умолчанию, если только метод ovveride Equals

sina fayazi 10.01.2023 14:16

@sinafayazi Правильно, но если OP использует тип record, это автоматически обеспечит правильную реализацию Equals().

Matthew Watson 10.01.2023 16:28

Первое переопределение Equals вашего класса person для сравнения двух объектов, таких как

public override bool Equals(object? obj)
    {
        return Id == (obj as person)?.Id && Name == (obj as person)?.Name;
    }

Тогда вы можете использовать пространство имен linq

list = list.OrderBy(x => x.Id).ThenBy(x => x.Name).ToList();
list.ForEach(x => x.Name = x.Name.ToUpper());
list = list.Distinct().ToList();
list.ForEach(x => x.Name = x.Name.ToUpper());
nilsK 10.01.2023 14:49

Если вы переопределяете Equals, переопределяйте и GetHashcode.

SomeBody 10.01.2023 15:16

Другие вопросы по теме