【问题标题】:How can I improve this sorting code? [closed]如何改进此排序代码? [关闭]
【发布时间】:2012-05-20 10:06:53
【问题描述】:

我正在检查排序参数并构建一堆if 语句:

if (sortDirection == "ASC")
{
    if (sortBy == "Id")
        return customerList.OrderBy(x => x.Id).Skip(startIndex).Take(pageSize).ToList();
    if (sortBy == "FirstName")
        return customerList.OrderBy(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList();
    if (sortBy == "City")
        return customerList.OrderBy(x => x.City).Skip(startIndex).Take(pageSize).ToList();
}
else
{
    if (sortBy == "Id")
        return customerList.OrderByDescending(x => x.Id).Skip(startIndex).Take(pageSize).ToList();
    if (sortBy == "FirstName")
        return customerList.OrderByDescending(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList();
    if (sortBy == "City")
        return customerList.OrderByDescending(x => x.City).Skip(startIndex).Take(pageSize).ToList();
}

我怎样才能让它变得更好?

【问题讨论】:

  • 定义“更好”。更适合什么?
  • 你想以什么方式“改进”它?它没有按预期工作吗?是不是太慢了?你不喜欢代码的结构吗?我们需要更多信息。
  • 我会推荐使用 LINQ 组合。见stackoverflow.com/questions/5881107/…
  • 创建一个代表字典,然后根据键调用它们。
  • 如果它可以更加动态,我不需要添加 if 语句仅仅因为一个新的 sortBy 字符串已经被发送,那就太好了。

标签: c# .net linq


【解决方案1】:

将您的排序和查询的其余部分分开 - 每个查询的相同部分您不必在代码库中复制(保留它DRY):

var query = customerList;

if (sortDirection == "ASC")
{
    if (sortBy == "Id")
       query = query.OrderBy(x => x.Id);
    ///and so on
}

query = query.Skip(startIndex).Take(pageSize).ToList();

【讨论】:

  • 这仍然是所有领域的大量样板,反射不是更干净吗?想象一下,如果他有 50 个字段! :)
  • @NiklasB。这将是一个问题,因为 OrderBy 是通用的,并且 lambda 对每个属性都有不同的类型。除非您想在任何地方将其转换为对象。
  • @mattytommo:如果这是一个内存集合,那肯定是可能的,而且很简洁
  • @Euphoric:哦,那肯定是个问题。我不太了解 C# :)
  • @Euphoric - 你可以创建一个Dictionary<string,IComparable>
【解决方案2】:

使用反射:)

customerList = (sortDirection == "ASC")
   ? customerList
        .OrderBy(x => x.GetType().GetProperty(sortBy).GetValue(x, null))
        .Skip(startIndex)
        .Take(pageSize)
        .ToList()
   : customerList
        .OrderByDescending(x => x.GetType().GetProperty(sortBy).GetValue(x, null))
        .Skip(startIndex)
        .Take(pageSize)
        .ToList();

【讨论】:

    【解决方案3】:

    看起来您只是想按属性名称作为字符串进行排序。在这种情况下,这实际上已经通过使用“Dynamic LINQ”解决了:

    Dynamic LINQ OrderBy on IEnumerable<T>

    看看这个问题的答案,它应该为您提供示例代码来解决您的问题。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      相关资源
      最近更新 更多