如何根据自己的属性和来自另一个列表的属性对列表进行排序?
How to sort a list by his own properties and properties from another list?
在我的应用程序中,我想显示来自不同联赛的足球table,例如英超联赛和西班牙甲级联赛。
我创建了一个 SeasonTableTeamObject,我在其中保存了所有值。 (TeamID, points, goals, losed goals, playedGames, wins, draws, feats)
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)
棘手的部分来了:这些联赛有不同的规则。我在联盟内部创建了一个变量class来区分规则集。
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;
}
在英超联赛中,您可以这样对 table 进行排序:
- 积分
- 净胜球
目标
SeasonTableList.OrderByDescending(p => p.Points).ThenByDescending(p => p.GoalDifference).ThenByDescending(p => p.Goals).ToList();
在西班牙甲级联赛中:
- 积分
- 直接比较(没有客场进球规则)
- 净胜球
直接比较是指积分相同的俱乐部之间的比赛结果。例如,皇家马德里和巴塞罗那都有 20 分。然后你必须比较这两个俱乐部之间的比赛。 (我在 Match 中创建了一个 WinnderTeamId 来做这个。我假设每场比赛必须有一个胜利者来简化)。
问题:按积分、目标等对列表进行排序没有问题,但是如何我可以实现西班牙联赛的行为。 (我有一个匹配列表
我在哪里可以找到特定的游戏,但我不知道该怎么做。我阅读了一些关于 IComparable
和 IComparer
的内容,但我不知道这是否是实现我的目标的正确方法...)
为了实现更复杂的比较方法,您可以使用IComparable<T>
或IComparer<T>
。当您想要实现不同的方法来比较对象时,您将创建几个实现 IComparer<SeasonTableTeamObject>
的 类(一个用于英超联赛比较,另一个用于 Primera Division)。
这个 interface 定义了一个名为 Compare
的方法,它接受两个对象并使用方法中的代码比较它们。结果,它 returns
- -1 如果 x 小于 y
- 0 如果 x 和 y 相等(就比较而言)
- 1 如果 x 大于 y
排序对象时,您可以使用OrderBy中的比较器来创建您喜欢的排序顺序,例如:
myItems.OrderBy(x => x, new MyComparer());
如果你想比较英超联赛的结果,你会使用英超联赛的比较器,否则使用西甲联赛的比较器。
您的比较器可能如下所示:
(我没试过看懂比较的规则,你要填逻辑)
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>
进行。它需要在内存中 运行。
在我的应用程序中,我想显示来自不同联赛的足球table,例如英超联赛和西班牙甲级联赛。
我创建了一个 SeasonTableTeamObject,我在其中保存了所有值。 (TeamID, points, goals, losed goals, playedGames, wins, draws, feats)
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)
棘手的部分来了:这些联赛有不同的规则。我在联盟内部创建了一个变量class来区分规则集。
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;
}
在英超联赛中,您可以这样对 table 进行排序:
- 积分
- 净胜球
目标
SeasonTableList.OrderByDescending(p => p.Points).ThenByDescending(p => p.GoalDifference).ThenByDescending(p => p.Goals).ToList();
在西班牙甲级联赛中:
- 积分
- 直接比较(没有客场进球规则)
- 净胜球
直接比较是指积分相同的俱乐部之间的比赛结果。例如,皇家马德里和巴塞罗那都有 20 分。然后你必须比较这两个俱乐部之间的比赛。 (我在 Match 中创建了一个 WinnderTeamId 来做这个。我假设每场比赛必须有一个胜利者来简化)。
问题:按积分、目标等对列表进行排序没有问题,但是如何我可以实现西班牙联赛的行为。 (我有一个匹配列表
我在哪里可以找到特定的游戏,但我不知道该怎么做。我阅读了一些关于 IComparable
和 IComparer
的内容,但我不知道这是否是实现我的目标的正确方法...)
为了实现更复杂的比较方法,您可以使用IComparable<T>
或IComparer<T>
。当您想要实现不同的方法来比较对象时,您将创建几个实现 IComparer<SeasonTableTeamObject>
的 类(一个用于英超联赛比较,另一个用于 Primera Division)。
这个 interface 定义了一个名为 Compare
的方法,它接受两个对象并使用方法中的代码比较它们。结果,它 returns
- -1 如果 x 小于 y
- 0 如果 x 和 y 相等(就比较而言)
- 1 如果 x 大于 y
排序对象时,您可以使用OrderBy中的比较器来创建您喜欢的排序顺序,例如:
myItems.OrderBy(x => x, new MyComparer());
如果你想比较英超联赛的结果,你会使用英超联赛的比较器,否则使用西甲联赛的比较器。
您的比较器可能如下所示:
(我没试过看懂比较的规则,你要填逻辑)
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>
进行。它需要在内存中 运行。