foreach Заказать по условию - PullRequest
0 голосов
/ 17 апреля 2020

Мне нравится делать OrderBy, если yy = true. Если yy = false, я не хочу делать OrderBy. Есть ли способ сделать это в выражении foreach, показанном ниже.

Если yy = true, он будет делать следующее:

     foreach (var item in data.OrderBy(a => a.SectSortOrderNo).GroupBy(x => new { x.SectId, x.SectName }))
     {
         ....
     };

, если yy = false, он будет делать следующее:

     foreach (var item in data.GroupBy(x => new { x.SectId, x.SectName }))
     {
         ....
     };

Я хотел бы объединить это в одном foreach с условием.

Мой другой вариант - 2 foreach с оператором if.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Если вы обнаружите, что издержки "нулевого" foreach слишком велики, вы можете просто условно добавить ForEach к запросу:

var query = data.AsEnumerable(); //or AsQueryable() if appropriate, just to get the variable type
if(yy)
{
    query = query.OrderBy(a => a.SectSortOrderNo);
}
query = query.GroupBy(x => new { x.SectId, x.SectName });
foreach (var item in query)
{
    ....
};    
1 голос
/ 17 апреля 2020

На самом деле все просто:

.OrderBy(a => yy ? a.SectSortOrderNo : default)

Сортировка .OrderBy() стабильна, что означает, что вы можете "отсортировать" их по постоянному значению и получить тот же порядок, как если бы вы не "сортировали" "them.

Проверьте следующий пример:

IList<int> data = new List<int> { 1, 4, 5, 2, 5, 1, 1, 7};
bool yy = true;
foreach (var v in data.OrderBy(it => yy ? it : default(int))) {
    Console.WriteLine(v);
}

Это приведет к ожидаемому результату:

1
1
1
2
4
5
5
7

При изменении переменной yy на false Вы сохраните оригинальный заказ:

1
4
5
2
5
1
1
7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...