Для Mac OS версии 1.13.1 (1.13.1) используйте CMD + P и введите имя файла, который вы хотите открыть.
Есть две проблемы. Первый - это тот, на который ссылались другие - вам нужно использовать значение, возвращаемое OrderBy
и т. Д. Второе, что каждый раз, когда вы вызываете OrderBy
, это добавляет новый «основной» заказ. Вы действительно хотите ThenBy
после применения первого порядка. К сожалению, это делает его довольно уродливым. После рефакторинга это все еще довольно некрасиво, но не тоже плохо ...
IEnumerable<Data> query = from item in items select item;
if (sortExpressionsExist)
{
// Won't be read in the first iteration; will be written to
IOrderedEnumerable<Data> orderedQuery = null;
for (int i = 0; i < sortExpressions.Count; i++)
{
// Avoid single variable being captured: capture one per iteration.
// Evil bug which would be really hard to find :)
int copyOfI = i;
// Tailor "object" depending on what GetProperty returns.
Func<Data, object> expression = item =>
item.GetType()
.GetProperty(sortExpressions[copyOfI].Name)
.GetValue(item, null);
if (sortExpressions[i].Direction == SortDirection.Ascending)
{
orderedQuery = (i == 0) ? query.OrderBy(expression)
: orderedQuery.ThenBy(expression);
}
else
{
orderedQuery = (i == 0) ? query.OrderByDescending(expression)
: orderedQuery.ThenByDescending(expression);
}
}
query = orderedQuery;
}
OrderBy возвращает новый IEnumerable, поэтому вам нужно сделать что-то вроде:
IEnumerable<Data> results
= query.OrderBy(item => item.GetType().GetProperty(sortExpressions[i].Name));
OrderBy на IEnumerable возвращает возвращает IOrderedEnumerable. Он не сортирует их по очереди. Так что получите возвращаемое значение из вашего .OrderBy, и все будет в порядке.
«Операторы» OrderBy / OrderByDescending работают как String.ToUpper (), то есть они берут то, на чем вы его вызываете, и создают «копию», в которой есть то, что вы просили.
Другими словами, вместо того, чтобы говорить:
query.Orderby(item->item.X)
, вы должны сделать
query = query.Orderby(item->item.X)
или
sortedResult = query.Orderby(item->item.X)
[И, как указывает Джон Скит, используйте ThenBy
/ ThenByDescending
как в его ответе]
Запрос неизменяем, поэтому OrderBy возвращает новый объект. Вам нужно сделать тот же вызов, но добавить "query =" в начало.
query = query.OrderBy(item => item.GetType().GetProperty(sortExpressions[i].Name));