You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:10:17