Пользовательская сортировка класса коллекции c # по нескольким свойствам - PullRequest
0 голосов
/ 20 августа 2011

Я сортирую пользовательский класс следующим образом, который сортируется по 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 ]

2 голосов
/ 21 августа 2011

Вы можете использовать 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;

Или вы можете заставить свой делегат сравнения возвращать правильную сортировку (вероятно, лучше, чем обычная функция, чем лямбда):

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 голос
/ 20 августа 2011

Вы также можете использовать прямые выражения LINQ: "OrderBy" и "ThenBy": Данные сортировки MSDN

ИЛИ

Вы должны расширить свое сравнениеВы должны помнить: a.CompareTo(b) должно возвращать -1, если a "меньше", чем b, 0, если они равны, и +1, если a "больше", чем b.Попробуйте следующее:

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 с этой функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...