Как отсортировать массив объектов сам по себе на основе свойства указанного объекта?

У меня есть несколько классов, сгенерированных из кода JSON, которые я десериализую:

public class Rootobject
{
    public Section[] sections { get; set; }
}

public class Section
{
    public string base_label { get; set; } = string.Empty;
    public Content[] contents { get; set; }
}

public class Content
{
    // main properties
    public int Index { get; set; }
    public string File { get; set; } = string.Empty;
    public string Label { get; set; } = string.Empty;
    public string Type { get; set; } = string.Empty;
}

Я создал новый объект и переменную для доступа к содержимому определенного раздела:

public Rootobject editData = new Rootobject();
var itemData = editData.sections[x].contents;

JSON десериализуется в editData

Я хочу изменить порядок содержимого, сортируя его по номеру индекса, загвоздка в том, что я не хочу создавать новый список, потому что editData используется для сериализации обратно в мой исходный файл JSON.

itemData.OrderByDescending(x => x.Index) ничего не сделал и itemData.contents.Sort((i1, i2) => i1.Index.CompareTo(i2.Index)); выдает ошибку

Невозможно преобразовать лямбда-выражение в тип «массив», поскольку оно не является типом делегата.

Поэтому я не уверен, как к этому подойти.

«похоже, ничего не делал» — OrderByDescending возвращает упорядоченное перечислимое. Вы что-нибудь делали с возвращаемым результатом? (например, присвойте его обратно свойству объекта, где вы хотите отсортировать коллекцию)

David 13.08.2024 20:17

«похоже, ничего не делал». Возвращает новый IEnumerable.

gunr2171 13.08.2024 20:17

Взгляните на этот пост: stackoverflow.com/questions/34116653/… (сильный претендент на обман)

gunr2171 13.08.2024 20:20

Да, я попробовал сделать то, что было предложено в этом посте, и сделал itemData = itemData.OrderBy(x => x.Index).ToList(); и получил следующую ошибку: Cannot implicitly convert type 'System.Collections.Generic.List<JSONProject.Content>' to 'JSONProject.Content[]' ... Я действительно пытался провести исследование по этому вопросу :( но я прошу прощения за то, что я зеленый. Что я такое здесь делаешь неправильно?

Saturn 13.08.2024 20:32

@Сатурн, какой тип itemData? Если это не List<JSONProject.Content>, то вам нужно это исправить.

maccettura 13.08.2024 20:35

@Saturn: Похоже, вам нужен ToArray() вместо ToList(), поскольку это разные типы. Также стоит отметить, что это изменит то, что находится в itemData, а не то, что в editData. Если вы хотите назначить свойство этого объекта, вам нужно будет назначить его. (например: editData.sections[x].contents = editData.sections[x].contents.OrderBy(/*...*/).ToArray();)

David 13.08.2024 20:36

@Дэвид, в этом была хитрость! Спасибо!! Я еще немного неопытный, поэтому все эти разные типы меня путали. Хотя это решило проблему :)

Saturn 13.08.2024 20:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

itemData.OrderByDescending(x => x.Index), похоже, ничего не делал

Это зависит от того, чего вы от него ожидаете. Он возвращает упорядоченное перечисляемое из исходных данных. Вам нужно присвоить этот возвращаемый результат чему-то.

Например:

editData.sections[x].contents = editData.sections[x].contents.OrderByDescending(x => x.Index).ToArray();

Это упорядочит содержимое editData.sections[x].contents и присвоит результат обратно тому же свойству. (Обратите внимание на добавление ToArray(), поскольку OrderByDescending вернет экземпляр IOrderedEnumerable<Content>, а ваше свойство имеет тип Content[].)

Если вы хотите сортировать на месте, правильный синтаксис: Array.Sort:

Array.Sort(itemData.contents, (i1, i2) => i1.Index.CompareTo(i2.Index));

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