Вы должны рассмотреть, что делает OrderBy
. Он упорядочивает коллекцию по значению, которое вы определяете в выражении лямбда, а затем возвращает перечислимый.
Ваш внешний вызов хорош для этого:
_sut.OrderDataArray.OrderBy(o => something).ToArray();
Вы вроде что-то, и затем конвертировать результат в (сортируют) массива. Здесь важны две вещи: Прежде всего, по крайней мере, в вашем примере есть только один объект в OrderDataArray
, поэтому никакого рода событий не происходит. Во-вторых, это зависит от возвращаемого значения something
, как сортируются эти объекты.
В таком случае, что такое something
? Это следующее:
o.OrderHeaderArray.OrderBy(a => somethingElse)
Таким образом, независимо от somethingElse
, что делает это возвращение? IEnumerable<OrderHeader>
. Как многочисленные перечислители сопоставляются друг с другом? Они не очень сопоставимы; и они особенно не сообщают вам о порядке, основанном на их содержании (вам придется сначала его перечислить).По сути, вы заказываете OrderHeaderArray
«чем-то другим», используйте результат, который ничего не говорит о заказе в качестве ключа для заказа OrderDataArray
. Затем вы выбросите отсортированный OrderHeaderArray
.
Вы делаете то же самое ровно на один уровень глубже с OrderPositionArray
, что опять не поможет. Единственный фактический полезный заказ происходит с самим OrderPositionArray
, но этот результат снова отбрасывается.
Теперь, если вы хотите заказать структуру, вы должны сделать это правильно, по reassinging отсортированной структуры массива. Так что в какой-то момент, вы должны сделать следующее:
a.OrderPositionArray = a.OrderPositionArray.OrderBy(p => p.LineNumber).ToArray();
Но кроме самого OrderPositionArray
и OrderHeader
, вы на самом деле не имеют ничего, что может быть отсортирован (потому что вы не можете на самом деле своего рода коллекции по заказу субколлекции). Таким образом, вы могли бы можно было решить, как это:
foreach (OrderData data in _sut.OrderDataArray)
{
foreach (OrderHeader header in data.OrderHeaderArray)
{
header.OrderPositionArray = header.OrderPositionArray.OrderBy(p => p.LineNumber).ToArray();
}
data.OrderHeaderArray = data.OrderHeaderArray.OrderBy(h => h.SequenceNumber).ToArray();
}
Вместо того, Linq, вы можете также отсортировать массивы в месте, которое, возможно, делает это немного лучше, так как вы не создаете новые внутренние массивы:
var c = Comparer<int>.Default;
foreach (OrderData data in _sut.OrderDataArray)
{
foreach (OrderHeader header in data.OrderHeaderArray)
{
Array.Sort(header.OrderPositionArray, new Comparison<OrderPositions>((x, y) => c.Compare(x.LineNumber, y.LineNumber)));
}
Array.Sort(data.OrderHeaderArray, new Comparison<OrderHeader>((x, y) => c.Compare(x.SequenceNumber, y.SequenceNumber)));
}
Что именно вы хотите отсортировать и по каким свойствам? –