Как отсортировать список по своим свойствам и свойствам из другого списка? - PullRequest
0 голосов
/ 30 января 2019

В моем приложении я хочу показать футбольные таблицы из разных лиг, например, английской премьер-лиги и испанского Primera Division.

Я создал объект SeasonTableTeamObject, в котором я сохраняю все значения.(TeamID, очки, голы, пропущенные голы, сыгранные игры, победы, ничьи, поражения)

public class SeasonTableTeamObject
{
    public int Points;
    public int Goals;
    public int AgainstGoals;
    public int TeamID;
    public string Teamname;
    public int PlayedGames;
    public int WinGames;
    public int DrawGames;
    public int LostGames;
    public int Rank;
    public int GoalDifference => (Goals - AgainstGoals);


    public SeasonTableTeamObject(int points, int goals, int againstGoals, int team, string teamName)
    {
        Points = points;
        Goals = goals;
        AgainstGoals = againstGoals;
        TeamID = team;
        Teamname = teamName;
        PlayedGames = 0;
        WinGames = 0;
        DrawGames = 0;
        LostGames = 0;
    }
}

Затем я создал список с этими объектами SeasonTableTeamObject для каждой лиги.(У каждого клуба в этой лиге есть свой собственный SeasonTableTeamObject)

Теперь самое сложное: у этих лиг разные правила.Я создал переменную внутри класса лиги, чтобы различать наборы правил.

public class League
{
    public List<Match> ListOfAlreadyPlayedMatches;
    public List<SeasonTableTeamObject> SeasonTableList;
    public int Rules;
}

public class Match 
{
    public int HomeTeamId;
    public int AwayTeamId;
    public int WinnerTeamId;
}

В Премьер-лиге вы сортируете таблицу следующим образом:

  1. Очки
  2. Разница голов
  3. Голы

    SeasonTableList.OrderByDescending (p => p.Points) .ThenByDescending (p => p.GoalDifference) .ThenByDescending (p => p.Goals).ToList ();

В испанском Primera Division:

  1. Очки
  2. Прямое сравнение (без правила выездных голов)
  3. Разница мячей

Прямое сравнение означает результат матчей между клубами, набравшими одинаковое количество очков.Например, Реал Мадрид и Барселона имеют по 20 очков.Затем вы должны сравнить матчи между этими двумя клубами.(Для этого я создал WinnderTeamId в Match. Я предполагаю, что в каждой игре должен быть победитель для упрощения).

Вопросы: сортировать список по баллам, целям и т. Д. Не было проблем, но как я могу добиться поведения испанской лиги.(У меня есть список матчей, в которых я могу найти конкретные игры, но я не знаю, как это сделать. Я читал кое-что о IComparable и IComparer, но я не знаю, является ли это правильным способомчтобы достичь моих целей ...)

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Ваш компаратор может выглядеть так:

(я не пытался понять правила сравнения, вам нужно заполнить логику)

public class SpanishSeasonTableTeamObjectComparer : IComparer<SeasonTableTeamObject>
{
    public Compare(SeasonTableTeamObject x, SeasonTableTeamObject y)
    {
         if(x.Points != y.Points)
         {
             return x.Points.CompareTo(y.Points);
         }

         // stack your various comparisons here, pattern like above...

         // if everything above is equal, compare on goals
         return x.Goals.CompareTo(y.Goals);
    }
}

Кажется целесообразным иметьотдельные классы сравнения для каждой лиги.Затем вы выполните сортировку одним вызовом, например SeasonTableList.OrderByDescending(new SpanishSeasonTableTeamObjectComparer()) Также неплохо было бы создать модульные тесты для компаратора для проверки правильности сортировки.Обратите внимание, что сравнение такого рода невозможно выполнить для объектов базы данных IQueryable<SeasonTableTeamObject>.Его нужно запустить в памяти.

0 голосов
/ 30 января 2019

Чтобы реализовать более сложный метод сравнения, вы можете использовать IComparable<T> или IComparer<T>.Поскольку вы хотите реализовать различные способы сравнения объектов, вы должны создать несколько классов, которые реализуют IComparer<SeasonTableTeamObject> (один для сравнения в Премьер-лиге, а другой - для Primera Division).

Этот интерфейс определяет метод с именем Compare, который принимает два объекта и сравнивает их, используя код в методе.В результате он возвращает

  • -1, если x меньше y
  • 0, если x и y равны (с точки зрения сравнения)
  • 1если x больше y

При сортировке объектов вы можете использовать компаратор в OrderBy , чтобы создать понравившийся порядок сортировки, например:

myItems.OrderBy(x => x, new MyComparer());

Если вы хотите сравнить результаты Премьер-лиги, вы должны использовать компаратор для Премьер-лиги, иначе - компаратор для премьер-лиги.

...