C# 将数组分成多个较小的数组(随机)
C# Separating An Array Into Multiple Smaller Arrays (Randomly)
我正在用 c# 为我和我的朋友制作一个 DISCORD.NET BOT,这是我第一次使用这种语言(我使用 VB.NET 但这里的语法对我来说是全新的) .
我的 "issue" 是我的命令之一“!squads”接受任意数量的用户名并将用户分成小组,这样我们就不必自己做,也不必为谁感到难过最后被选中。我不会解释我的代码,它包含在下面并且非常简单。
我的问题围绕着当输入 6 或 7 个名字时,5 个很容易做到。但是对于 6 我想要两队 4 和 2,对于 7 两队 4 和 3 随机选择。
这是我对如何做到这一点的想法,但我认为它会很混乱,所以我希望得到一些指示!对于 6 个名字,创建 2 个数组,其中最大项为 2 和 4,首先随机填充 2,然后将其余的推入 4。对于 7 做同样的事情,首先填充 3 的团队,然后将其余的推入 4。我相信这是一种比在数组之间来回切换更有效的方法。但是,我可能需要从主数组中删除选定的用户,每次都重新索引数组,这样我就不会再次选择同一个人,并且还需要更改随机生成器中选择指数。我可以做所有这些,但它会很草率,有没有一种方法可以在没有 60-70 行 for 和 if 循环的情况下干净利落地做到这一点?
这是我的代码,谢谢! :)
[Command("Squads")]
public async Task CreateSquads(params string[] usersArray)
{
int totalUsers = usersArray.Length;
Random squadSelector = new Random();
string squadsMessage;
if (totalUsers < 5)
{
squadsMessage = "I am sensing 4 or less names, just play squads, clowns.";
}
else if (totalUsers == 5)
{
string selectedUser = usersArray[squadSelector.Next(0, usersArray.Length)];
squadsMessage = "Tough luck " + selectedUser + ", better luck next time!";
}
else if (totalUsers == 6)
{
// Split users into two teams of 2 and 4
squadsMessage = "6 people."; // Placeholder
}
else if (totalUsers == 7)
{
// Split users into two teams of 3 and 4
squadsMessage = "7 people."; // Placeholder
}
else
{
// More than 7 people. (not coding for this)
squadsMessage = "We have this many friends? Wut.";
}
// Originally used this just to spit out the names for testing
//for (int i = 0; i < totalUsers.Length; i++)
//{
// await Context.Channel.SendMessageAsync(totalUsers[i]);
//}
await Context.Channel.SendMessageAsync(squadsMessage);
更新的代码,完美运行!谢谢大家! :)
[Command("Squads")]
public async Task CreateSquads(params string[] usersArray)
{
string[] squadOne;
string[] squadTwo;
int totalUsers = usersArray.Length;
Random squadSelector = new Random();
StringBuilder sb = new StringBuilder();
string squadsMessage;
if (totalUsers < 5)
{
squadsMessage = "I am sensing 4 or less names, just play squads, morons.";
}
else if (totalUsers >= 5 && totalUsers <= 7)
{
// 5 users becomes 4 and 1; 6 users becomes 4 and 2; 7 users becomes 4 and 3
usersArray = usersArray.OrderBy(i => squadSelector.Next()).ToArray();
squadOne = usersArray.Take(4).ToArray();
squadTwo = usersArray.Skip(4).Take(totalUsers - 4).ToArray();
sb.Append("__**Squad One:**__");
sb.Append(Environment.NewLine);
for (int i = 0; i < squadOne.Length; i++)
{
sb.Append(squadOne[i]);
sb.Append(Environment.NewLine);
}
sb.Append(Environment.NewLine);
if (totalUsers == 5)
{
sb.Append("__**LOL, Loser:**__");
}
else
{
sb.Append("__**Squad Two:**__");
}
sb.Append(Environment.NewLine);
for (int i = 0; i < squadTwo.Length; i++)
{
sb.Append(squadTwo[i]);
sb.Append(Environment.NewLine);
}
squadsMessage = sb.ToString();
}
else
{
// More than 7 people.
squadsMessage = "We have this many friends? Wut.";
}
await Context.Channel.SendMessageAsync(squadsMessage);
}
我会这样做:
var usersArray = new string[] { "1", "2", "3", "4", "5", "6", "7" };
var r = new Random();
usersArray = usersArray.OrderBy(i => r.Next()).ToArray();
var firstGroup = usersArray.Take(3).ToArray();
var secondGroup = usersArray.Skip(3).Take(4).ToArray();
带有 OrderBy(i => r.Next()) 的行将随机排序。然后您可以轻松地将项目分成两组。
您也可以将此代码提取到方法中:)
我正在用 c# 为我和我的朋友制作一个 DISCORD.NET BOT,这是我第一次使用这种语言(我使用 VB.NET 但这里的语法对我来说是全新的) .
我的 "issue" 是我的命令之一“!squads”接受任意数量的用户名并将用户分成小组,这样我们就不必自己做,也不必为谁感到难过最后被选中。我不会解释我的代码,它包含在下面并且非常简单。
我的问题围绕着当输入 6 或 7 个名字时,5 个很容易做到。但是对于 6 我想要两队 4 和 2,对于 7 两队 4 和 3 随机选择。
这是我对如何做到这一点的想法,但我认为它会很混乱,所以我希望得到一些指示!对于 6 个名字,创建 2 个数组,其中最大项为 2 和 4,首先随机填充 2,然后将其余的推入 4。对于 7 做同样的事情,首先填充 3 的团队,然后将其余的推入 4。我相信这是一种比在数组之间来回切换更有效的方法。但是,我可能需要从主数组中删除选定的用户,每次都重新索引数组,这样我就不会再次选择同一个人,并且还需要更改随机生成器中选择指数。我可以做所有这些,但它会很草率,有没有一种方法可以在没有 60-70 行 for 和 if 循环的情况下干净利落地做到这一点?
这是我的代码,谢谢! :)
[Command("Squads")]
public async Task CreateSquads(params string[] usersArray)
{
int totalUsers = usersArray.Length;
Random squadSelector = new Random();
string squadsMessage;
if (totalUsers < 5)
{
squadsMessage = "I am sensing 4 or less names, just play squads, clowns.";
}
else if (totalUsers == 5)
{
string selectedUser = usersArray[squadSelector.Next(0, usersArray.Length)];
squadsMessage = "Tough luck " + selectedUser + ", better luck next time!";
}
else if (totalUsers == 6)
{
// Split users into two teams of 2 and 4
squadsMessage = "6 people."; // Placeholder
}
else if (totalUsers == 7)
{
// Split users into two teams of 3 and 4
squadsMessage = "7 people."; // Placeholder
}
else
{
// More than 7 people. (not coding for this)
squadsMessage = "We have this many friends? Wut.";
}
// Originally used this just to spit out the names for testing
//for (int i = 0; i < totalUsers.Length; i++)
//{
// await Context.Channel.SendMessageAsync(totalUsers[i]);
//}
await Context.Channel.SendMessageAsync(squadsMessage);
更新的代码,完美运行!谢谢大家! :)
[Command("Squads")]
public async Task CreateSquads(params string[] usersArray)
{
string[] squadOne;
string[] squadTwo;
int totalUsers = usersArray.Length;
Random squadSelector = new Random();
StringBuilder sb = new StringBuilder();
string squadsMessage;
if (totalUsers < 5)
{
squadsMessage = "I am sensing 4 or less names, just play squads, morons.";
}
else if (totalUsers >= 5 && totalUsers <= 7)
{
// 5 users becomes 4 and 1; 6 users becomes 4 and 2; 7 users becomes 4 and 3
usersArray = usersArray.OrderBy(i => squadSelector.Next()).ToArray();
squadOne = usersArray.Take(4).ToArray();
squadTwo = usersArray.Skip(4).Take(totalUsers - 4).ToArray();
sb.Append("__**Squad One:**__");
sb.Append(Environment.NewLine);
for (int i = 0; i < squadOne.Length; i++)
{
sb.Append(squadOne[i]);
sb.Append(Environment.NewLine);
}
sb.Append(Environment.NewLine);
if (totalUsers == 5)
{
sb.Append("__**LOL, Loser:**__");
}
else
{
sb.Append("__**Squad Two:**__");
}
sb.Append(Environment.NewLine);
for (int i = 0; i < squadTwo.Length; i++)
{
sb.Append(squadTwo[i]);
sb.Append(Environment.NewLine);
}
squadsMessage = sb.ToString();
}
else
{
// More than 7 people.
squadsMessage = "We have this many friends? Wut.";
}
await Context.Channel.SendMessageAsync(squadsMessage);
}
我会这样做:
var usersArray = new string[] { "1", "2", "3", "4", "5", "6", "7" };
var r = new Random();
usersArray = usersArray.OrderBy(i => r.Next()).ToArray();
var firstGroup = usersArray.Take(3).ToArray();
var secondGroup = usersArray.Skip(3).Take(4).ToArray();
带有 OrderBy(i => r.Next()) 的行将随机排序。然后您可以轻松地将项目分成两组。 您也可以将此代码提取到方法中:)