我如何创建一个程序来获取名称列表,并将它们分类为偶数组?

时间:2010-01-28 15:42:22

标签: c# list random

我希望能够创建一个程序,该程序将从.txt文件中获取名称列表(不必是txt,也许是excell,最简单的),并将这些名称生成为组或“团队”。

我有30个“用户”,必须分为“团队”。我希望能够公平地做到这一点,所以我想随意:P。

我尚未决定每队的人数,但我很快就会确定。

3队10人 5支队伍6名

感谢您的回复。

4 个答案:

答案 0 :(得分:2)

如果列表中只有30个人,您可以将整个文本文件读入内存中,按行分隔,随机化,然后浏览列表并创建组。

所以,像这样:

public List<String[]> CreateTeams(String filePath, int membersPerTeam)
{
  String[] allUsers = File.ReadAllLines(filePath);   
  List<String> randomUsers = allUsers.OrderBy(s => new Guid()).ToList();
  int teamCount = allUsers.Length / membersPerTeam;
  var teams = new List<String[]>();

  for (int i = 0; i < teamCount; i++)
  {
    String[] team = new String[membersPerTeam];
    for (int j = 0; j < usersPerTeam; j++)
    {
      team[j] = randomUsers[i * membersPerTeam + j];
    }
    teams.Add(team);
  }
  return teams;
}

虽然显然你需要更多的错误检查等等,并且嵌套循环有点难看,但你明白了。当然,如果用户总数不能被每个团队的成员整除,那么这将不起作用。但是,这应该让你去。

答案 1 :(得分:1)

由于这不是家庭作业,它看起来像一个有趣的小项目...(这是一个巨大的扰流板)

使用VS 2010 Beta 2为.Net 4.0构建的控制台应用

class Program
{
    static void Main()
    {
        /* Assuming one team per line */
        Team[] teams = File.ReadAllLines("teams.txt")
                            .Select(t => new Team(t))
                            .ToArray();

        /* Guid.NewGuid() is creates a sufficiently random order */
        /* Assuming one player per line */
        string[] players = File.ReadAllLines("players.txt")
                                .OrderBy(s => Guid.NewGuid())
                                .ToArray();

        /* 
         * No use randomizing anymore...
         * Just assign (PlayerCount / TeamCount) players to each team 
         */
        for (int i = 0; i < teams.Length; i++)
        {
            var p = players.Skip(i * players.Length / teams.Length)
                            .Take(players.Length / teams.Length);

            teams[i % teams.Length].Players.AddRange(p);
        }

        foreach (Team t in teams)
        {
            System.Diagnostics.Debug.WriteLine(t);
        }
    }
}

class Team
{
    public string Name { get; set; }
    public List<string> Players { get; set; }

    public Team(string name)
    {
        Name = name;
        Players = new List<string>();
    }

    public override string ToString()
    {
        /* Team name plus the players sorted alphabetically */
        /*//.Net 4.0
        return string.Format("{0}  \n{1}",
            Name,
            string.Join("  \n",
                        Players.Select(p => string.Concat("\t", p))
                               .OrderBy(s => s)));
        */

        //.Net 3.5 & 4.0
        return string.Format("{0}  \n{1}",
            Name,
            string.Join("  \n",
                        Players.Select(p => string.Concat("\t", p))
                               .OrderBy(s => s).ToArray()));
    }
}

示例输出:

Colts  
    Chuck  
    Cory  
    Jim  
    Sam  
    Ulysses
Saints  
    Al  
    Brett  
    Hank  
    Ned  
    Quinn
Vikings  
    Dave  
    Don  
    Ernie  
    Frank  
    Gus
Jets  
    Bob  
    Eric  
    Isaac  
    Walt  
    Yancy
Chargers  
    Abe  
    Mark  
    Oscar  
    Xavier  
    Zach
Cardinals  
    Fred  
    Kyle  
    Pete  
    Ralph  
    Tom

答案 2 :(得分:0)

  1. 从文件中加载您的名称列表。
  2. 创建一个团体/团队列表。
  3. 虽然名单中仍有项目,但使用0到列表长度的随机数从列表中取一个项目并添加到一个组中(即设计的随机播放)。
  4. 您需要研究以下内容才能实现此目的:

答案 3 :(得分:0)

您没有提供有关遇到问题的详细信息,但此处概述了您需要做的事情。


第1步:解析文本文件。像System.IO.File.ReadAllLines这样的东西对此可能很好。
第2步:随机洗牌。这很简单。尝试类似this的内容。
第3步:将列表分成连续的组。所以对于3支10人的队伍,只需要拿出第一组,第二组和第三组的10个名字,那些就是你的团队。

如果这是一次性的事情,我只是将文本文件粘贴到http://www.random.org/lists/然后手动执行第3步来自己完成。