C# 对列表进行二次排序。排序方法

C# 对列表进行二次排序。排序方法,c#,asp.net,sorting,C#,Asp.net,Sorting,我有一个通用列表,我正试图实现一个二级排序类型。我能够按一种类型对其进行良好排序,但在获得第二种排序时遇到困难 以下是我的工作内容: 当我调用排序时: List<Totals> totals = new LoadTotalList(); totals.Sort(Totals.Status); List totals=new LoadTotalList(); 总计.排序(总计.状态); 下面是Totals类: public class Totals { public stri

我有一个通用列表,我正试图实现一个二级排序类型。我能够按一种类型对其进行良好排序,但在获得第二种排序时遇到困难

以下是我的工作内容:

当我调用排序时:

List<Totals> totals = new LoadTotalList();
totals.Sort(Totals.Status); 
List totals=new LoadTotalList();
总计.排序(总计.状态);
下面是Totals类:

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


}
公共类总计
{
公共字符串状态{get;set;}
公共字符串总计{get;set;}
公共字符串成本{get;set;}
公共静态比较状态comp=
代表(总计项目1、总计项目2)
{
返回item1.Status.CompareTo(item2.Status);
};
公共静态比较成本比较=
代表(总计项目1、总计项目2)
{
返回项目1.成本比较(项目2.成本);
};
}

我试着对第一种类型进行排序,然后对第二种类型进行排序,但似乎无法得到第二种排序类型。我知道可以使用OrderBy子句然后再使用BEY子句与Linq一起完成。但我还有其他选择吗。提前感谢您的帮助

很容易创建一个
比较
,它有一个主要比较,然后是一个次要比较:

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

(您也可以轻松地对
IComparer
执行同样的操作。)

创建一个
比较
,它有一个主要比较,然后是一个次要比较:

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);
        };
    }
}
(您也可以轻松地对
IComparer
执行相同操作。)

您可以使用允许使用自定义比较委托的:

totals.Sort((t1, t2) => {
    if (t1.Status != t2.Status) return t1.Status.CompareTo(t2.Status);
    else return t1.Cost.CompareTo(t2.Cost);
});
您可以使用允许使用自定义比较委托的:

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

谢谢你,乔恩!你让我站起来工作。我非常感谢。Jon,这个类不是应该是静态的吗,因为它是一个扩展方法?谢谢Jon!你让我站起来工作。我非常感激。Jon,这个类不应该是静态的,因为它是一个扩展方法吗?这也是一个很好的选择。这两个都是很好的答案。谢谢,请注意
=始终使用顺序比较。在顺序比较中,字符串完全可能不相等,但是
CompareTo
返回0。(参见文档中的
string.CompareTo
)这也是一个很好的选择。这两个都是很好的答案。谢谢,请注意
=始终使用顺序比较。在顺序比较中,字符串完全可能不相等,但是
CompareTo
返回0。(有关示例,请参见
string.CompareTo
的文档。)