C# foreach OrderBy条件
如果yy=true,我喜欢做OrderBy。如果yy=false,我不想执行OrderBy。在下面显示的foreach语句中是否有这样做的方法 如果yy=true,它将执行以下操作: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
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()
,如本问题所述)。