我有以下方法将排序应用于对象列表(为示例简化了它):
private IEnumerable<Something> SetupOrderSort(IEnumerable<Something> input,
SORT_TYPE sort)
{
IOrderedEnumerable<Something> output = input.OrderBy(s => s.FieldA).
ThenBy(s => s.FieldB);
switch (sort)
{
case SORT_TYPE.FIELD1:
output = output.ThenBy(s => s.Field1);
break;
case SORT_TYPE.FIELD2:
output = output.ThenBy(s => s.Field2);
break;
case SORT_TYPE.UNDEFINED:
break;
}
return output.ThenBy(s => s.FieldC).ThenBy(s => s.FieldD).
AsEnumerable();
}
我需要的是能够在orby子句中插入特定字段。默认情况下,排序为:FIELDA,FIELDB,FIELDC,FIELDD。
当指定了排序字段时,我需要在排序顺序中在FIELDB和FIELDC之间插入指定的字段。
目前只有2个可能的字段要排序,但最多可以达到8个。性能明智这是一个好方法吗?有没有更有效的方法呢?
编辑:我也看到了以下主题:Dynamic LINQ OrderBy on IEnumerable<T>但我认为这对我所需的内容来说太过分了。这是一段执行很多的代码片段,所以我只是想确保我没有做一些可以很容易地完成的事情,而我只是缺少了。
答案 0 :(得分:2)
不要试图用探查器“优化”你没有证明过的东西。
这种情况发生的可能性很小。我强烈怀疑实际排序列表的开销高于切换一个字符串。
重要的问题是:此代码是否可维护?下次向case
添加属性时,您会忘记添加其他Something
吗?如果这将是一个问题,请考虑使用VS 2008 C#样本页面中的MS Dynamic Query示例。
否则,你很好。
答案 1 :(得分:1)
你的方法没有任何低效率,但是它有一些不直观的,这是你无法按多个列排序 - 最终用户差不多一定要做。
我可能会把这个问题放在一边,因为两个列都是唯一的,但是你最后在另一种类型中硬编码的事实让我相信Field1
和{{1}既不相关也不唯一,在这种情况下,你真的应该考虑具有任意数量的排序级别的可能性,可能是通过接受Field2
或IEnumerable<SORT_TYPE>
参数而不是单params SORT_TYPE[]
}。
无论如何,就性能而言,SORT_TYPE
和OrderBy
扩展程序有延迟执行,因此代码中的每个连续ThenBy
可能不再与一些CPU指令相比,它只是将一个函数包装在另一个函数中。没事的;实际的分拣会更加昂贵。