如何创建实现IOrderedEnumerable的空实例?能否替换OrderBy(p=>1)?
问题解答
1. 能否创建实现IOrderedEnumerable的空实例?
可以实现。.NET没有直接提供IOrderedEnumerable<T>的空实例构造方式,但可以通过对空序列调用OrderBy生成,示例代码:
var emptyOrderedEnumerable = Enumerable.Empty<T>().OrderBy(_ => 0);
因为序列本身是空的,这里的常量键选择器_ => 0不会触发实际的比较操作,最终得到的就是一个空的IOrderedEnumerable<T>实例。
2. 替换src.OrderBy(p=>1)消除不必要比较
当前代码里的src.OrderBy(p=>1)会生成基于常量键的有序序列,排序过程中会做无意义的比较操作。我们可以通过分情况处理替换这段代码,同时明确排序逻辑完全由传入的names参数决定:
- 若
names为空数组,直接返回原序列即可; - 若
names不为空,用第一个字段作为初始排序的键选择器,后续字段通过ThenBy依次追加排序规则。
另外注意原代码中src.GetType().GetElementType()的潜在问题:如果传入的src不是数组(比如List<T>),GetElementType()会返回null,改用typeof(T)能适配所有IEnumerable<T>类型的输入。
修改后的完整函数代码如下:
static IEnumerable<T> GetOrderedEnum<T>( IEnumerable<T> src, params string[] names) where T : class { if (names.Length == 0) return src; var type = typeof(T); var orderedEnum = src.OrderBy(p => type.GetField(names[0])!.GetValue(p)); for (int i = 1; i < names.Length; i++) { var field = type.GetField(names[i])!; orderedEnum = orderedEnum.ThenBy(p => field.GetValue(p)); } return orderedEnum; }
内容的提问来源于stack exchange,提问作者Konstantin Makarov
相关产品推荐
相关产品推荐

