自定义c#集合类按多个属性排序

时间:2011-08-20 08:57:13

标签: c# asp.net sorting

我按如下方式对自定义类进行排序,按FirstHalfPoints排序:

 var firstHalfTables = new FirstHalfTableCollection();
        firstHalfTables.PopulateForSeason(SeasonId);
        firstHalfTables.Sort((t1, t2) => t1.FirstHalfPoints.CompareTo(t2.FirstHalfPoints));
        firstHalfTables.Reverse();
        FirstHalfTableRepeater.DataSource = firstHalfTables;
        FirstHalfTableRepeater.DataBind();

我还需要另外两个字段'GD' - 目标差异和'GF' - 目标 - 按照'FirstHalfPoints'的初始排序

排序

所以完成的集合将由FirstHalfPoints排序,然后由GD排序,然后由GF排序。

任何人都可以帮助我进行多次排序吗?

2 个答案:

答案 0 :(得分:2)

您可以使用LINQ,这通常会使代码更具可读性:

var firstHalfTables = new FirstHalfTableCollection();
firstHalfTables.PopulateForSeason(SeasonId);
var firstHalfTablesProcessed = (from table in firstHalfTables
                                orderby table.FirstHalfPoints, table.GD, table.GF
                                select table).Reverse()
FirstHalfTableRepeater.DataSource = firstHalfTablesProcessed;

或者你可以让你的比较委托返回正确的排序(可能比lambda更好的正常函数):

int FirstHalfTableComparison(FirstHalfTable t1, FirstHalfTable t2)
{
    int result = t1.FirstHalfPoints.CompareTo(t2.FirstHalfPoints);

    if (result == 0)
    {
        result = t1.GD.CompareTo(t2.GD);

        if (result == 0)
            result = t1.GF.CompareTo(t2.GF);
    }

    return result;
}

你可以这样使用:

firstHalfTables.Sort(FirstHalfTableComparison);

答案 1 :(得分:1)

您可以使用直接LINQ表达式:“OrderBy”和“ThenBy”:MSDN Sorting Data

OR

你必须扩大比较范围。你必须要记住:a.CompareTo(b)如果a小于b,则返回-1,如果它们相等则返回0,如果a大于b,则返回+1。 请尝试以下方法:

private void Compare(YourRow a, YourRow b)
{
   let v = a.FirstHalfPoints.CompareTo(b.FirstHalfPoints);
   if (v != 0) return v;

   v = a.GD.CompareTo(b.GD);
   if (v != 0) return v;

   return a.GF.CompareTo(b.GF);
}

并使用此功能调用Sort