如何通过他自己的属性和另一个列表的属性对列表进行排序?

时间:2019-01-30 08:52:43

标签: c# list compare icomparable icomparer

在我的应用中,我想显示来自不同联赛的足球桌,例如英超联赛和西班牙Primera联赛。

我创建了一个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;
    }
}

然后,我为每个联赛创建了带有这些SeasonTableTeamObjects的列表。 (该联盟中的每个俱乐部都有自己的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部门:

  1. 积分
  2. 直接比较(无目标规则)
  3. 目标差异

直接比较是指得分相同的俱乐部之间的比赛结果。例如,皇马和巴塞罗那都有20分。然后,您必须比较这两个俱乐部之间的比赛。 (为此,我在Match中创建了WinnderTeamId。为简化起见,我假设每款游戏中都必须有一个获胜者。)

问题:按得分,目标等对列表进行排序没有问题,但是如何可以实现西班牙联赛的行为。 (我有一个比赛清单 在哪里可以找到特定的游戏,但是我不知道该怎么做。我读了一些有关IComparableIComparer的内容,但我不知道这是否是实现目标的正确方法...)

2 个答案:

答案 0 :(得分:2)

为了实现更复杂的比较方法,可以使用IComparable<T>IComparer<T>。当您想要实现比较对象的不同方法时,您将创建几个实现IComparer<SeasonTableTeamObject>的类(一个用于英超联赛比较,另一个用于Primera部门)。

interface定义了一个名为Compare的方法,该方法接受两个对象,并使用该方法中的代码对其进行比较。结果,它返回

  • -1,如果x小于y
  • 如果x和y相等,则为0(根据比较)
  • 如果x大于y,则为1

对对象进行排序时,可以使用OrderBy中的比较器来创建所需的排序顺序,例如:

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

如果要比较英超联赛的结果,则可以使用英超联赛的比较器,否则使用Primera分区的比较器。

答案 1 :(得分:1)

您的比较器可能如下所示:

(我没有试图理解比较规则,您必须填写逻辑)

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>进行这种比较。它需要在内存中运行。