Как мне создать Программу, которая будет брать список имен и сортировать их по ДАЖЕ группам? - PullRequest
1 голос
/ 28 января 2010

Я хочу иметь возможность создать программу, которая будет принимать список имен из файла .txt (не обязательно должен быть txt, может быть превосходным, что бы ни было проще) и генерировать эти имена в группы или «команды».

У меня есть 30 «пользователей», которых нужно отсортировать по «командам». Я хочу быть в состоянии сделать это честно, поэтому я хочу случайным образом: P.

Я еще не определил количество человек в команде, но скоро буду.

3 команды из 10 5 команд по 6

Спасибо за ответ.

Ответы [ 4 ]

2 голосов
/ 28 января 2010

Если в списке всего 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 голос
/ 28 января 2010

Так как это не домашняя работа, и это выглядело как забавный маленький проект ... (Это один огромный спойлер)

Консольное приложение для .Net 4.0 с VS 2010 Beta 2

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
0 голосов
/ 28 января 2010

Вы не предоставили достаточно информации о том, где у вас возникли проблемы, но вот обзор того, что вам нужно сделать.


Шаг 1: Разбор текстового файла. Что-то вроде System.IO.File.ReadAllLines, вероятно, хорошо для этого.
Шаг 2: перемешать список случайным образом. Это довольно легко. Попробуйте что-то вроде это .
Шаг 3: Разделите список на последовательные группы. Таким образом, для 3 команд по 10 человек просто возьмите первый, второй и третий набор из 10 имен, и это ваши команды.

Если это один раз, я бы сам сделал это, вставив текстовый файл в http://www.random.org/lists/, а затем выполнив шаг 3 вручную.

0 голосов
/ 28 января 2010
  1. Загрузить список имен из файла.
  2. Создать список групп / команд.
  3. Пока в списке имен все еще есть элементы, используйте случайное число от 0 до длины списка, чтобы взять один элемент из списка и добавить его в группу (то есть придуманный случайный выбор).

Вам нужно изучить следующее, чтобы выполнить это:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...