簡體   English   中英

從C#中的對象列表創建組

[英]Create Groups from a list of Objects in C#

我有一個稱為“團隊”的對象列表,我想創建它們的組,但不按順序隨機分配。 組號既提供給功能又提供給列表

public List<List<Team>> GenerateGroups(List<Team> teams, int amount)
{
    List<List<Team>> result = new List<List<Team>>();
    for (int i = 0; i < amount; ++i)
        result.Add(new List<Team>());
    foreach(Team team in teams)
    {
        //Add something           
    }
    return result;
}

我被困在這里。 我不確定如何添加團隊。 另外,如果有人可以壓縮我的代碼,那將非常有幫助。 如果有人有更好的主意,我不需要它返回List>。

這將隨機命令您的teams ,然后將它們分組。 列表中輸出組的amount取決於amount參數:

public static List<List<Team>> GenerateGroups(List<Team> teams, int amount)
{
    return teams.OrderBy(item => Guid.NewGuid())
            .Select((item, index) => new { Item = item, GroupIndex = index % amount })
            .GroupBy(item => item.GroupIndex, 
                     (key, group) => group.Select(groupItem => groupItem.Item).ToList())
            .ToList();
}

也可以使用Random類進行Random但我將使用它來創建訂單而不是按其group by 像這樣:

public static List<List<Team>> GenerateGroups(List<Team> teams, int amount)
{
    Random random = new Random();
    return teams.OrderBy(item => random.NextDouble())
            .Select((item, index) => new { Item = item, GroupIndex = index % amount })
            .GroupBy(item => item.GroupIndex,
                     (key, group) => group.Select(groupItem => groupItem.Item).ToList())
            .ToList();
}

我認為最好像下面這樣定義Group類:

class Group {
   List<Team> teams;
}

關於添加團隊:

Random rnd = new Random();
List<Group> groups = new List<Group>();
        for (int i = 0; i < amount; ++i)
            groups.Add(new Group());

        foreach(Team team in teams)
        {
            int index = rnd.Next(0, amount);
            groups[index].Add(team);
        }
        return groups;

這給出了隨機組,沒有重復項:

private static Random _rnd = new Random();

private static Team GetAndRemoveRandomTeam(List<Team> allTeams)
{
    int randomIndex = _rnd.Next(allTeams.Count);
    Team randomTeam = allTeams[randomIndex];
    allTeams.RemoveAt(randomIndex);
    return randomTeam;
}

public static List<List<Team>> GenerateGroups(List<Team> teams, int amount)
{
    int teamCount = (int) teams.Count/amount;
    List<Team> allteams = teams.ToList(); // copy to be able to remove items

    if (teamCount == 0)
        return new List<List<Team>> {allteams};

    List<List<Team>> allTeamGroups = new List<List<Team>>();
    List<Team> thisTeam = new List<Team>();
    while (allteams.Count > 0)
    {
        if (thisTeam.Count == amount)
        {
            allTeamGroups.Add(thisTeam);
            thisTeam = new List<Team>();
        }
        thisTeam.Add(GetAndRemoveRandomTeam(allteams));
    }
    allTeamGroups.Add(thisTeam);

    return allTeamGroups;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM