C# - 为此目的的 LINQ 查询

C# - LINQ Query for this purpose

我有以下 class 这些字段

public class Account {
     public int Id { get; set; }
     public string Username { get; set; }
     public float Timezone { get; set; }
}

public class Player {
     public int Id { get; set; }
     public virtual Account Account { get; set; }
     public string Team_Name { get; set; }
}

现在假设我有一个名为 Players 的 List<> Player,每个团队有 2 个玩家,这意味着每个 Team_Name 将重复两次。例如。 X 队有球员 A 和球员 B,球员列表<>中的两个条目代表。

我想要实现的是根据时区将团队配对,因为每个团队有 2 名玩家,我应该通过访问玩家 class 中的 Account.Timezone 字段来计算每个团队的平均时区, 然后找到平均时区最接近的另一支球队来匹配他们的球队。

Example

您可以使用 GroupBy() 将您的 List<Player> 按 Team_Name 分组,然后从那里开始。

但是,我的偏好是创建一个新实体 Team 并为该实体提供 Player1 和 Player2 属性,或者 List<Player> Players 属性。然后我会有一个 getter TeamTimezone 来计算团队中球员的平均时区。

添加一个class来表示团队的概念,更清楚地表达你的程序在做什么,使其更易于理解并减少错误的机会。

假设你有一个 Match class 这样的:

public class Match
{
    public string Team1 { get; set; }
    public string Team2 { get; set; }
}

你可以用 LINQ 做这样的事情:

var matches =
    Players.GroupBy(player => player.Team_Name) //Group players by team name
        .Select(
            team => //For each team
                new
                {
                    TeamName = team.Key, //Select team name
                    AverageTimezone = //And average time zone
                        team.Average(player => player.Account.Timezone)
                })
        .OrderBy(team => team.AverageTimezone) //Order teams by average time zone
        .Select((team, index) => new {Team = team, Index = index})
        .GroupBy(item => item.Index/2) //Group each two teams together (since the teams are ordered by average timezone, each two teams will have a close timezone)
        .Select(g => g.Select(item => item.Team).ToList())
        .Select(g => new Match
        {
            Team1 = g[0].TeamName,
            Team2 = g[1].TeamName
        })
        .ToList();