C# 从C中的对象列表创建组#

C# 从C中的对象列表创建组#,c#,list,grouping,C#,List,Grouping,我有一个名为Team的对象列表,我想创建一组对象,但不按顺序随机创建。组编号与列表一起提供给函数 public List<List<Team>> GenerateGroups(List<Team> teams, int amount) { List<List<Team>> result = new List<List<Team>>(); for (int i = 0; i < amount;

我有一个名为Team的对象列表,我想创建一组对象,但不按顺序随机创建。组编号与列表一起提供给函数

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;
}
公共列表生成组(列表团队,整数金额)
{
列表结果=新列表();
对于(int i=0;i

我被困在这里了。我不知道如何添加团队。另外,如果有人能压缩我的代码,这将是非常有帮助的。如果有人有更好的想法,我不需要它来返回List>。

我认为您最好定义
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;
Random rnd=new Random();
列表组=新列表();
对于(int i=0;i
我认为您最好定义
类,如:

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;
Random rnd=new Random();
列表组=新列表();
对于(int i=0;i
这将随机对您的
团队进行排序,然后将他们分组。列表中输出组的数量取决于
数量
参数:

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();
}

这将随机排列
团队
,然后将他们分组。列表中输出组的数量取决于
数量
参数:

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();
}

这一个给出了没有重复项的随机组:

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;
}
private static Random\u rnd=new Random();
私有静态团队GetandReveRandomTeam(列出所有团队)
{
int randomIndex=\u rnd.Next(allTeams.Count);
团队随机团队=所有团队[随机索引];
allTeams.RemoveAt(随机索引);
返回团队;
}
公共静态列表生成器组(列表团队,整数金额)
{
int teamCount=(int)teams.Count/amount;
List allteams=teams.ToList();//复制以删除项目
如果(团队计数==0)
返回新列表{allteams};
List allTeamGroups=新列表();
List thisTeam=新列表();
while(allteams.Count>0)
{
如果(thisTeam.Count==金额)
{
添加(此团队);
thisTeam=新列表();
}
添加(GetAndRemoveRandomTeam(allteams));
}
添加(此团队);
返回所有团队;
}

这一个随机分组没有重复:

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;
}
private static Random\u rnd=new Random();
私有静态团队GetandReveRandomTeam(列出所有团队)
{
int randomIndex=\u rnd.Next(allTeams.Count);
团队随机团队=所有团队[随机索引];
allTeams.RemoveAt(随机索引);
返回团队;
}
公共静态列表生成器组(列表团队,整数金额)
{
int teamCount=(int)teams.Count/amount;
List allteams=teams.ToList();//复制以删除项目
如果(团队计数==0)
返回新列表{allteams};
List allTeamGroups=新列表();
List thisTeam=新列表();
while(allteams.Count>0)
{
如果(thisTeam.Count==金额)
{
添加(此团队);
thisTeam=新列表();
}
添加(GetAndRemoveRandomTeam(allteams));
}
添加(此团队);
返回所有团队;
}


组的大小必须相等吗?
静态随机rnd=new Random();var randomObjectIndex=rnd.Next(list.Count);var FinallList.Add(list[randomObjectIndex])
从中获取随机对象的方法list@KevinLee否,因为我需要为团队和金额变量添加额外的限制。我现在试着让它工作。@MKasprzyk对象列表是预定义的。我想把它们随机放置。分组随机<代码>随机=新随机();teams.GroupBy(p=>random.Next(amount))
。请注意,a比Random和GUID好。组的大小必须相等吗?
static Random rnd=new Random();var randomObjectIndex=rnd.Next(list.Count);var FinallList.Add(list[randomObjectIndex])
从中获取随机对象的方法list@KevinLee否,因为我需要为团队和金额变量添加额外的限制。我现在试着让它工作。@MKasprzyk对象列表是预定义的。我想把它们随机放置。分组随机<代码>随机=新随机();teams.GroupBy(p=>random.Next(amount))
。请注意,a比Random和GUID更好。这就是我稍后要做的。现在,我正在寻找括号中的代码,在括号中有注释,这是我稍后要做的。现在,我正在寻找括号中的代码,其中包含comments@Tonio-见我的编辑。我不会为分组做这件事,因为
Random
可能会给我两次相同的数字-然后如果我按它分组,那么我会得到不均匀大小的组。我认为你的解决方案是好的,可以压缩。让我用我的代码来测试一下,我建议
NextDouble()
Next(teams.Count)
,你会得到更好的随机性,我相信它也会更有效一分钟,而且Guid速度很快,但不像它应该的那样随机。如果您需要更高质量的随机性,请使用
RNGCryptoServiceProvider
(但速度会更慢)。@GiladGreen是的,但没有重复。我甚至尝试了一个50个对象的列表。我会投票认为它是正确的。@Tonio-请看我的编辑。我不会这样做分组,因为
Random
可能会给我两次相同的数字-然后如果我按它分组,我会得到不均匀大小的组