Сортировка списка C# с условием ИЛИ

#c# #.net #linq

Вопрос:

Я пытаюсь отсортировать список, который поступает из моей базы данных. Если все поля в моем OrderFunds столбце есть null , я хочу отсортировать их по другому столбцу. Кто-нибудь может сказать мне, как это сделать?

Это мой код:

 List<Fund> funds = await fundSupervisor.List().Where(fund => fund.IsActive)
                                              .OrderBy(fund => fund.OrderFunds)
 

Или мое OrderBy предложение может допускать null значения. Это бы мне тоже помогло.

Комментарии:

1. Вы, наверное, хотите .ThenBy(...)

2. OrderBy у вас не должно быть проблем с нулями, однако в вашем коде есть проблема. Похоже, что этот List() метод, возможно, извлекает записи из базы данных и материализует все в список. Последовательно Where и OrderBy выглядят так, как будто они работают со списком в памяти. Это огромная трата ресурсов сервера!

3. Если все фонды заказов равны нулю, я хочу отсортировать их по другому столбцу — вам просто нужно поискать if(list.Any(item => item.OrderFunds != null)) { OrderByOrderFunds } else { OrderBySomethingElse} . Затем выполняется упорядочение в памяти

Ответ №1:

Это и есть решение

 List<Fund> funds = fundSupervisor
.Where(w => w.IsActive)
.OrderBy(w => w.OrderFunds)
.ThenBy(w => w.OtherField).ToList();
 

ThenBy() позволяет указать другие поля для сортировки списка.

Комментарии:

1. Я думаю, что название поста плохое, так как это НЕ условие ИЛИ. Но в ситуации операции, когда все значения полей OrderBy равны НУЛЮ, выигрывает ThenBy.

2. @Grandizer то, что ты сказал, правда!

Ответ №2:

Если вам нужно сортировать совершенно по-другому, если и только если все столбцы равны нулю, вам нужно проверить это заранее.

 List<Fund> funds = await fundSupervisor.List().Where(fund => fund.IsActive)
if(funds .Any(item => item.OrderFunds != null))
    funds = funds.OrderBy(fund => fund.OrderFunds);
else
    funds = funds.OrderBy(fund => fund.SomethingElse);
 

В противном случае, если вы хотите отсортировать по другому значению , если OrderFunds есть null , то вы можете просто использовать условие внутри OrderBy .

 var orderedFunds = funds.OrderBy(fund => fund.OrderFunds ?? SomeOtherValue);
 

Если вы хотите выполнить сортировку по другому значению в качестве вторичной сортировки, используйте a ThenBy . Это сортирует все значения по ThenBy значению -, если в операции-несколько одинаковых значений OrderBy .

 var orderedThenByFunds = funds.OrderBy(fund => fund.OrderFunds).ThenBy(fund => fund.SomeOtherValue);
 

Учтите, что эти линии отличаются:
Допустим, у вас есть 3 предмета (предполагается OrderFunds , что int? :

 Fund1 { OrderFunds = 1, SomeOtherValue = 8 }
Fund2 { OrderFunds = 3, SomeOtherValue = 6 }
Fund3 { OrderFunds = null, SomeOtherValue = 4 }
Fund4 { OrderFunds = null, SomeOtherValue = 2 }
 

Затем orderedFunds вернул бы Fund1(1), Fund4(2[Другое значение]), Fund2(3), Fund3(4[Другое значение]) и orderedThenByFunds вернул бы Fund1(1,8), Fund2(3,8), Fund4(null,2), Fund3(null,2). Значения в фигурных скобках-это значения, упорядоченные по.