我有一个通用列表,我正在尝试实现二级排序类型。我可以通过一种类型对其进行排序,但无法进行二次排序。
以下是我正在使用的内容:
当我打电话时排序:
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。但我还有其他选择吗?在此先感谢您的帮助!
答案 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);
});