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 字段来计算每个团队的平均时区, 然后找到平均时区最接近的另一支球队来匹配他们的球队。
您可以使用 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();
我有以下 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 字段来计算每个团队的平均时区, 然后找到平均时区最接近的另一支球队来匹配他们的球队。
您可以使用 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();