如何将一个数组一分为二?

How to divide an array into two?

我是 C# 的初学者。我想在纸牌游戏中将等量的纸牌发给 2 名玩家。我必须将我的数组(纸牌)分成两部分,以便每个玩家都拥有相同数量的纸牌。我已经使用 my GetImages() 将所有(全部 40 张)图像随机化为 1 pictureBox。所以接下来我必须将它分成两部分,并在我的表单加载时将它们放入 pictureBox 中。 非常感谢任何帮助,谢谢。

这是我的代码:

 public string[] GetImages(){
        string[] img = new string[40];

        img[0] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[1] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[2] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[3] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[4] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[5] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[6] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[7] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[8] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[9] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[10] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[11] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[12] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
        img[13] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards.png";
//so on and so forth
            return 
                img;
        }

    public void Form2_Load(object sender, EventArgs e)
    {
//the code I'm trying now:
        string[] Player1Array = GetImages(40/2);

假设您只需要将一个数组(或 List)的元素分成 first/second 一半——如果需要,通常会使用 Enumerable.Take/Enumerable.Skip followed by Enumerable.ToArray 转换为数组:

string[] Player1Array = GetImages().Take(20).ToArray();
string[] Player2Array = GetImages().Skip(20).ToArray();

首先,您必须认识到代码中的一个问题:您不能使用带参数的 getImages 函数(我指的是 40/2),因为它没有定义参数。

我对随机化卡片有不同的建议。 将两个数组传递给 getImg 函数,该函数会将卡片随机分配给玩家 1。然后根据包含0-39随机排列的数字的数组随机到player2。 link 将帮助您了解如何生成一组随机的唯一数字(它使用列表,但您可以安全地将其替换为数组):

https://codereview.stackexchange.com/questions/61338/generate-random-numbers-without-repetitions

所以 getImg 函数将是这样的:

public string [] GetImages(string [] player1Array, string [] player2Array){ 
 int [] randomArray=getRandomNembers(); //this call depends on how you define the function 
  player1Array[randomArray[0]]=" your location here";
  // so on until 
  player1Array[randomArray[19]]=" your location here";
  //then you start with player 2 
  player2Array[randomArray[20]]=" your location here";
  //and so on
}

阿列克谢死定了。如果我们想变得更复杂,你可以这样做:

public static List<string[]> Partition(this string[] source, Int32 size)
    {
        var output = new List<string[]>();
        for (int i = 0; i < Math.Ceiling(source.Count() / (Double)size); i++)
            output.Add(source.Skip(size * i).Take(size).ToArray());
        return output;
    }

灵感来自于此C# - elegant way of partitioning a list?

所以要使用它,您所要做的就是:

var chunkSize = 40 / 4;
var chunks = GetImages().GetImages(chunkSize);

块中的每个元素都是原始片段。每个块中有多少个字符串取决于块大小的参数。 40/4 会给你 4 个块。第一项包含前 10 个。第二个包含接下来的 10 个,依此类推直到最后 10 个。这样您就可以根据需要轻松地对数组进行分段。