1

我有一个我正在尝试实现辅助排序类型的通用列表。我可以让它按一种类型很好地排序,但是在进行二级排序时遇到了麻烦。

这是我正在使用的内容:

当我调用排序时:

List<Totals> totals = new LoadTotalList();
totals.Sort(Totals.Status); 

这是总计类:

public class Totals
{
  public string Status { get; set; } 
  public string Total { get; set; } 
  public string Cost { get; set; } 

  public static Comparison<Totals> StatusComp = 
delegate(Totals item1, Totals item2)
{
 return item1.Status.CompareTo(item2.Status);
};

  public static Comparison<Totals> CostComp = 
delegate(Totals item1, Totals item2)
{
 return item1.Cost.CompareTo(item2.Cost);
};


}

我尝试对第一种类型进行排序,然后对第二种类型进行排序,但似乎无法获得次要排序类型。我知道它可以通过 Linq 使用 OrderBy 子句然后 ThenBy 子句来完成。但是我还有其他选择吗?在此先感谢您的帮助!

4

2 回答 2

6

Comparison<T>创建一个具有主要比较然后是次要比较的对象很容易:

public static class Comparisons
{
    public static Comparison<T> Then<T>(this Comparison<T> primary,
                                        Comparison<T> secondary)
    {
        // TODO: Nullity validation
        return (x, y) =>
        {
            int first = primary(x, y);
            return first != 0 ? first : secondary(x, y);
        };
    }
}

然后你可以使用:

list.Sort(Totals.StatusComp.Then(Totals.CostComp));

(您也可以IComparer<T>轻松地做同样的事情。)

于 2013-04-08T15:01:24.180 回答
2

您可以使用允许使用自定义比较委托的重载:List.Sort

totals.Sort((t1, t2) => {
    if (t1.Status != t2.Status) return t1.Status.CompareTo(t2.Status);
    else return t1.Cost.CompareTo(t2.Cost);
});
于 2013-04-08T15:05:49.797 回答