c# - 如何按他自己的属性和另一个列表中的属性对列表进行排序?
问题描述
在我的应用程序中,我想显示来自不同联赛的足球表,例如英超联赛和西班牙甲级联赛。
我创建了一个 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;
}
在英超联赛中,您可以像这样对表格进行排序:
- 积分
- 目标差异
目标
SeasonTableList.OrderByDescending(p => p.Points).ThenByDescending(p => p.GoalDifference).ThenByDescending(p => p.Goals).ToList();
在西班牙甲级联赛中:
- 积分
- 直接比较(无客场进球规则)
- 目标差异
直接比较是指得分相同的俱乐部之间的比赛结果。例如皇家马德里和巴塞罗那都有 20 分。然后你必须比较这两个俱乐部之间的比赛。(我在 Match 中创建了一个 WinnderTeamId 来执行此操作。我假设每个游戏中都必须有一个获胜者以进行简化)。
问题:按积分、目标等对列表进行排序是没有问题的,但是我怎样才能实现西班牙联赛的行为。(我有一个匹配列表,我可以在其中找到特定游戏,但我不知道如何做到这一点。我阅读了一些关于 theIComparable
和 the 的内容,IComparer
但我不知道这是否是实现目标的正确方法.. .)
解决方案
为了实现更复杂的比较方法,您可以使用IComparable<T>
或IComparer<T>
。由于您想要实现不同的方法来比较对象,您将创建几个实现的类IComparer<SeasonTableTeamObject>
(一个用于英超联赛比较,另一个用于甲级联赛)。
该接口定义了一个调用方法,该方法Compare
接受两个对象并使用方法中的代码比较它们。结果,它返回
- -1 如果 x 小于 y
- 0 如果 x 和 y 相等(就比较而言)
- 1 如果 x 大于 y
在对对象进行排序时,您可以使用OrderBy中的比较器来创建您喜欢的排序顺序,例如:
myItems.OrderBy(x => x, new MyComparer());
如果您想比较英超联赛的结果,您将使用英超联赛的比较器,否则使用甲级联赛的比较器。
推荐阅读
- kotlin - 以类型安全且符合人体工程学的方式访问通用异构集合
- idris - %inline 对 Idris 的真正作用是什么?以及何时使用它?
- javascript - 粘性/固定导航栏,滚动时 BG 透明到实体(无引导程序)
- c - 使用 C 在 Gtk 中创建小部件列表
- firebase - 如何永远不会在 Firebase 托管的网络应用程序上通过谷歌登录退出?
- c# - 如何基于 Entity Framework Core 数据库中的另一个表创建计算列-first
- java - 我想在 mainactivity java 类中使用片段 UI 元素 id 来完成 mainactivity 类而不是片段类上的单击侦听器事件
- python - 将给定数组拆分为 k 个子数组,使得所有子数组的最大和最小
- c++ - 仅从文件中读取特定数据...如果传递字符串值,则从文件c ++ 98中读取所有内容
- css - 如何将切换的 DIV 粘贴到切换导航栏的顶部