我希望能够创建一个程序,该程序将从.txt文件中获取名称列表(不必是txt,也许是excell,最简单的),并将这些名称生成为组或“团队”。
我有30个“用户”,必须分为“团队”。我希望能够公平地做到这一点,所以我想随意:P。
我尚未决定每队的人数,但我很快就会确定。
3队10人 5支队伍6名
感谢您的回复。
答案 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)
您需要研究以下内容才能实现此目的:
答案 3 :(得分:0)
您没有提供有关遇到问题的详细信息,但此处概述了您需要做的事情。
第1步:解析文本文件。像System.IO.File.ReadAllLines
这样的东西对此可能很好。
第2步:随机洗牌。这很简单。尝试类似this的内容。
第3步:将列表分成连续的组。所以对于3支10人的队伍,只需要拿出第一组,第二组和第三组的10个名字,那些就是你的团队。
如果这是一次性的事情,我只是将文本文件粘贴到http://www.random.org/lists/然后手动执行第3步来自己完成。