List.Sort方法的二级排序

时间:2013-04-08 14:59:16

标签: c# asp.net sorting

我有一个通用列表,我正在尝试实现二级排序类型。我可以通过一种类型对其进行排序,但无法进行二次排序。

以下是我正在使用的内容:

当我打电话时排序:

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

以下是Totals Class:

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);
};


}

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

2 个答案:

答案 0 :(得分: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>执行相同操作。)

答案 1 :(得分:1)

您可以使用允许使用自定义比较委托的overload of List.Sort

totals.Sort((t1, t2) => {
    if (t1.Status != t2.Status) return t1.Status.CompareTo(t2.Status);
    else return t1.Cost.CompareTo(t2.Cost);
});