如何将一个列表分成两个可以容纳奇数个计数的列表?

时间:2019-12-19 10:48:38

标签: c# sql list

我有一个包含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;
        }

3 个答案:

答案 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”即可。