我有一个包含9个人的sql列表“ GetStaff()”,当代码运行时,它将他们分成两个团队,但每个团队只显示4个。我无法在团队中显示第9名成员。我该如何调整代码以容纳奇数人数,而不仅仅是在拆分团队中。任何帮助都将有所帮助。
public List<Staff[]> CreateTeams(int membersPerTeam)
{
IList<Staff> allUsers = GetStaff();
int teamCount = allUsers.Count / membersPerTeam;
int usersPerTeam = allUsers.Count / 2;
var teams = new List<Staff[]>();
for (int i = 0; i < teamCount; i++)
{
Staff[] team = new Staff[membersPerTeam];
for (int j = 0; j < usersPerTeam ; j++)
{
team[j] = allUsers[i * membersPerTeam + j];
}
teams.Add(team);
}
return teams;
}
答案 0 :(得分:3)
我将使用LINQ:
public List<Staff[]> CreateTeams(int membersPerTeam)
{
IList<Staff> allUsers = GetStaff();
int teams = allUsers.Count() / membersPerTeam + allUsers.Count() % membersPerTeam == 0 ? 0 : 1;;
return
allUsers
.Select((x, n) => new { x, n })
.GroupBy(z => z.n % teams)
.Select(zs => zs.Select(z => z.x).ToArray())
.ToList();
}
这只是将列表投影为包含一个n
索引号,然后根据该membersPerTeam
的模数n
进行分组。然后删除索引并返回结果。
答案 1 :(得分:1)
这行可能是您的问题
int usersPerTeam = allUsers.Count / 2;
当您有奇数时,它将丢失小数部分,当结果必须为int
时将丢失9/2 = 4
尝试检查奇数,如果奇数则加一个
var userCount = allUsers.Count % 2 = 0 ? allUsers.Count : allUsers.Count + 1
int teamCount = userCount / 2
答案 2 :(得分:1)
基于@Enigmativity的回答和评论中的说明,我建议使用他的解决方案的简化版本:
public List<Staff[]> CreateTwoTeams() // No argument => You don't know the total number
{
return
GetStaff() // Get all members
.Select((x, n) => new { x, n }) // add an index
.GroupBy(z => z.n % 2) // Create 2 Groups: Even and Odd
.Select(zs => zs.Select(z => z.x) // For each Group: make an array
.ToArray()) // of the members
.ToList(); // Make a List of those arrays.
}
如果您以后选择设置队数变量,则只需引入一个参数并用其替换硬编码的“ 2”即可。