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()) 的行将随机排序。然后您可以轻松地将项目分成两组。 您也可以将此代码提取到方法中:)