C#: 按枚举值排序/OrderBy枚举值

4

我有一个从Linq2Sql中实例化的IEnumerable。我已经过滤掉了我想要的记录,现在我想根据选择的枚举对它们进行排序:

public enum Sort
{
  Time,
  Name,
  Value
}

public class LinqClass
{
   public DateTime Time;
   public string Name;
   public double Value;
}

Sort sort = Sort.Time
items.OrderBy(sort);

最好的方法是什么?我可以创建一个重载的 OrderBy(Sort s) 方法,它只是一个大的 switch 语句:

switch(sort)
  case Time:
    return this.OrderBy(x=>x.Time);

我可能可以使用字典来处理。还有其他想法吗?或者有没有标准模式可以实现这个功能。


1
说实话,这个 switch 很好。其他东西会更难维护。 - Marc Gravell
1
作为一个案例,传递一个自定义的比较器并使用内置的 List.Sort() 方法,这是一种非常重的解决方案,但也非常灵活和清晰。 - sll
2个回答

3

一般来说,使用switch语句可能是最好的方法,因为这样可以很容易地发现传递了无效的值。

你也可以使用Dictionary<Sort, Func<IEnumerable<LinqClass>, IEnumerable<LinqClass>>>,但我认为这样做并不值得。


1
好的,谢谢。有没有一种巧妙的方法可以在不创建扩展方法OrderBy(this IEnumerable<T> e, Sort s)的情况下完成这个操作?我想你可以使用items.OrderBy(x=>x.SortRating(sort)),其中SortRating返回一个double类型的值。不确定这是否更好。 - Mark
1
@Mark:不行,因为每个排序都会返回不同的类型...所以你需要在“OrderBy”中使用不同的类型参数。 - Jon Skeet

1
如果你把数据实现为一个 List,你可以使用带有 Comparison 委托的 Sort 方法,并从字典中选择比较方式:
var comparisons = new Dictionary<Sort, Func<LinqClass, LinqClass, int>();
sorting.Add(Sort.Time, (x, y) => x.Time.CompareTo(y.Time));
sorting.Add(Sort.Name, (x, y) => x.Name.ComapreTo(y.Name));
sorting.Add(Sort.Value, (x, y) => x.Value.CompareTo(y.Value));

items.Sort(comparisons[sort]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接