C#-LINQ查询用于此目的
我有以下带有这些字段的类C#-LINQ查询用于此目的,c#,asp.net-mvc,linq,entity-framework-5,C#,Asp.net Mvc,Linq,Entity Framework 5,我有以下带有这些字段的类 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 { ge
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; }
}
现在假设我有一个名为球员的球员列表,每个队有2名球员,这意味着每个队的名字会重复两次。例如,X队有球员A和球员B,球员列表中的两个条目代表这一点
我想要实现的是根据时区将团队配对,因为每个团队有2名玩家,我应该通过访问玩家类中的Account.timezone字段来计算每个团队的平均时区,然后找到另一个具有最接近平均时区的团队,以与他们匹配
您可以使用GroupBy()按团队名称对列表进行分组,然后从那里开始
然而,我的偏好是创建一个新的实体团队,并为该实体提供Player1和Player2属性,或列出玩家属性。然后我会有一个getterteamtimezone来计算团队中球员的平均时区
添加一个类来表示团队的概念,可以更清楚地表达您的程序在做什么,使其更易于理解并减少出现错误的机会。假设您有一个匹配的类,如下所示:
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();
对于输出,我只需要一个排序的玩家列表,它将是列表中的索引[0]团队vs索引[1],依此类推。。。输出中不应重复输入团队名称是否有理由不使用包含玩家的团队
类?是的,因为实际上有一个称为Tournaments的第三类,玩家类只是用来处理帐户和锦标赛之间的多对多关系,我没有包括它,因为它不需要求解,上面两个类都有更多的字段。平均值可以是team.average(player=>player.Account.Timezone)
谢谢,但我不知道如果玩家列表中有奇数个entries@HappySylveon,但是你在问题中说,每支球队有2名球员,这意味着每支球队的名字都会重复两次。