这是使用字段动态排序执行linq查询的有效方法吗?

时间:2010-02-23 21:21:19

标签: c# linq

我有以下方法将排序应用于对象列表(为示例简化了它):

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>但我认为这对我所需的内容来说太过分了。这是一段执行很多的代码片段,所以我只是想确保我没有做一些可以很容易地完成的事情,而我只是缺少了。

2 个答案:

答案 0 :(得分:2)

不要试图用探查器“优化”你没有证明过的东西。

这种情况发生的可能性很小。我强烈怀疑实际排序列表的开销高于切换一个字符串。

重要的问题是:此代码是否可维护?下次向case添加属性时,您会忘记添加其他Something吗?如果这将是一个问题,请考虑使用VS 2008 C#样本页面中的MS Dynamic Query示例。

否则,你很好。

答案 1 :(得分:1)

你的方法没有任何低效率,但是它有一些不直观的,这是你无法按多个列排序 - 最终用户差不多一定要做。

我可能会把这个问题放在一边,因为两个列都是唯一的,但是你最后在另一种类型中硬编码的事实让我相信Field1和{{1}既不相关也不唯一,在这种情况下,你真的应该考虑具有任意数量的排序级别的可能性,可能是通过接受Field2IEnumerable<SORT_TYPE>参数而不是单params SORT_TYPE[] }。

无论如何,就性能而言,SORT_TYPEOrderBy扩展程序有延迟执行,因此代码中的每个连续ThenBy可能不再与一些CPU指令相比,它只是将一个函数包装在另一个函数中。没事的;实际的分拣会更加昂贵。