У меня есть несколько классов, сгенерированных из кода 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));
выдает ошибку
Невозможно преобразовать лямбда-выражение в тип «массив», поскольку оно не является типом делегата.
Поэтому я не уверен, как к этому подойти.
«похоже, ничего не делал». Возвращает новый IEnumerable.
Взгляните на этот пост: stackoverflow.com/questions/34116653/… (сильный претендент на обман)
Да, я попробовал сделать то, что было предложено в этом посте, и сделал itemData = itemData.OrderBy(x => x.Index).ToList();
и получил следующую ошибку: Cannot implicitly convert type 'System.Collections.Generic.List<JSONProject.Content>' to 'JSONProject.Content[]'
... Я действительно пытался провести исследование по этому вопросу :( но я прошу прощения за то, что я зеленый. Что я такое здесь делаешь неправильно?
@Сатурн, какой тип itemData
? Если это не List<JSONProject.Content>
, то вам нужно это исправить.
@Saturn: Похоже, вам нужен ToArray()
вместо ToList()
, поскольку это разные типы. Также стоит отметить, что это изменит то, что находится в itemData
, а не то, что в editData
. Если вы хотите назначить свойство этого объекта, вам нужно будет назначить его. (например: editData.sections[x].contents = editData.sections[x].contents.OrderBy(/*...*/).ToArray();
)
@Дэвид, в этом была хитрость! Спасибо!! Я еще немного неопытный, поэтому все эти разные типы меня путали. Хотя это решило проблему :)
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));
«похоже, ничего не делал» —
OrderByDescending
возвращает упорядоченное перечислимое. Вы что-нибудь делали с возвращаемым результатом? (например, присвойте его обратно свойству объекта, где вы хотите отсортировать коллекцию)