C# foreach OrderBy条件

C# foreach OrderBy条件,c#,C#,如果yy=true,我喜欢做OrderBy。如果yy=false,我不想执行OrderBy。在下面显示的foreach语句中是否有这样做的方法 如果yy=true,它将执行以下操作: foreach (var item in data.OrderBy(a => a.SectSortOrderNo).GroupBy(x => new { x.SectId, x.SectName })) { .... }; foreach (v

如果yy=true,我喜欢做OrderBy。如果yy=false,我不想执行OrderBy。在下面显示的foreach语句中是否有这样做的方法

如果yy=true,它将执行以下操作:

     foreach (var item in data.OrderBy(a => a.SectSortOrderNo).GroupBy(x => new { x.SectId, x.SectName }))
     {
         ....
     };
     foreach (var item in data.GroupBy(x => new { x.SectId, x.SectName }))
     {
         ....
     };
如果yy=false,它将执行以下操作:

     foreach (var item in data.OrderBy(a => a.SectSortOrderNo).GroupBy(x => new { x.SectId, x.SectName }))
     {
         ....
     };
     foreach (var item in data.GroupBy(x => new { x.SectId, x.SectName }))
     {
         ....
     };
我喜欢把这个和一个条件结合起来

我的另一个选择是带有if语句的2foreach


先谢谢你

其实很简单:

.OrderBy(a => yy ? a.SectSortOrderNo : default)
.OrderBy()
排序是稳定的,这意味着您可以按常量值“排序”它们,并获得与未“排序”它们相同的顺序

检查以下示例:

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);
}
通过将
yy
变量更改为
false
,您将保持原始顺序:

1
4
5
2
5
1
1
7

其实很简单:

.OrderBy(a => yy ? a.SectSortOrderNo : default)
.OrderBy()
排序是稳定的,这意味着您可以按常量值“排序”它们,并获得与未“排序”它们相同的顺序

检查以下示例:

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);
}
通过将
yy
变量更改为
false
,您将保持原始顺序:

1
4
5
2
5
1
1
7

如果您发现“null”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)
{
    ....
};    

如果您发现“null”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)
{
    ....
};    

这个问题需要更多的细节和清晰。你是说当
a
(或者
a.SectSortOrderNo
,听起来不像
bool
?)是
false
时,你不希望它包含在输出中,或者你希望它包含在源代码顺序中?这是在已有的
data.OrderBy().GroupBy()
之后应用的有条件的
OrderBy()
,还是您正在枚举的查询正试图实现这一点?也就是说,当你说“在”每个人的
之内时,你是指身体还是
中的
?编辑:是否
yy
数据
之外?似乎需要动态构建查询。是否可以在
foreach()
之前构建LINQ,特别是使用
ìf()
语句来添加
OrderBy()
按需部分,还是应该将此逻辑添加到
foreach()
语句内的现有LINQ行?@Progman,我进一步阐述。谢谢。这个问题需要更多的细节和清晰。你是说当
a
(或者
a.SectSortOrderNo
,听起来不像
bool
?)是
false
时,你不希望它包含在输出中,或者你希望它包含在源代码顺序中?这是在已有的
data.OrderBy().GroupBy()
之后应用的有条件的
OrderBy()
,还是您正在枚举的查询正试图实现这一点?也就是说,当你说“在”每个人的
之内时,你是指身体还是
中的
?编辑:是否
yy
数据
之外?似乎需要动态构建查询。是否可以在
foreach()
之前构建LINQ,特别是使用
ìf()
语句来添加
OrderBy()
按需部分,还是应该将此逻辑添加到
foreach()
语句内的现有LINQ行?@Progman,我进一步阐述。谢谢。这很聪明,但我怀疑
OrderBy()
无法(或根本无法)识别何时它实际上是一个无操作,并且将不得不像往常一样,在它生成任何输出之前缓冲所有输入。与您的建议相比,当
yy
false
时,这会引入更多毫无益处的工作,并会导致对查询进行缓冲,否则不会这样做(例如,随后调用
GroupBy()
,如本问题中所述)。这很聪明,但我怀疑
OrderBy()
不会(或根本不能)认识到什么时候它实际上是一个no-op,并将不得不像往常一样缓冲所有的输入,然后才能产生任何输出。与您的建议相比,当
yy
false
时,这将引入更多的无用工作,并将导致对查询进行缓冲,否则查询不会进行缓冲(例如,随后调用
GroupBy()
,如本问题所述)。