在 c# 中将字符串数组的每个元素拆分为一个新数组



我对c#很陌生。

我已经从文本文件中导入了一个名为txtImport的数组。它包含两个玩家的1000个扑克手,所以实际上有2000个扑克手。

文件中的每一行的结构如下:

8C TS KC 9H 4S 7D 2S 5D 3S AC

其中前 5 张是玩家 1 的牌,后 5 张是玩家 2 的牌。

该数组包含 1000 手。我想把这个数组分成两个数组,一个包含玩家一的所有手牌,一个包含玩家二的所有手牌。因此,每个元素都需要从中间拆分并删除空格。

我不知道该怎么做,我已经尝试了很多事情,但没有一件是正确的。我想使用 foreach 循环遍历每个元素,将其切成两部分,删除中间的空格,然后将切割字符串的前半部分分配给一个名为 playerOneHands 的新数组,将切割字符串的后半部分分配给一个名为 playerTwoHands 的新数组。

但是我完全迷失在语法或 c# 中如何处理这个问题。我想我错误地从 python 方式接近它。谁能指出我正确的方向?


编辑:

大家好,这最终是使用代码解决的:

string[] txtImport = System.IO.File.ReadAllLines(@"C:UsersJoshDesktopC#poker.txt"); // Importing each line of the text file into an element in an array called txtImport
string[] playerOneHands = new string[txtImport.Length];
string[] playerTwoHands = new string[txtImport.Length];
int i = 0;
foreach (var item in txtImport)
{
playerOneHands[i] = item.Substring(0, 14); // dividing the import array into two arrays each containing the list of hands of either player
playerTwoHands[i] = item.Substring(15, 14);
i++
}

使用一些数学运算。你总是有偶数手和奇数个空格。即,字符串的长度总是奇数。使用整数算术,可以将字符串的长度除以 2。这会产生截断的结果,即一个玩家的手的长度没有中间的空间。第二个玩家手牌的起始索引是这个长度 + 1 跳过中间的空间。

string[] txtImport = File.ReadAllLines(myFile);
string[] playerOneHands = new string[txtImport.Length];
string[] playerTwoHands = new string[txtImport.Length];
for (int i = 0; i < txtImport.Length; i++) {
string hands = txtImport[i]; // "8C TS KC 9H 4S 7D 2S 5D 3S AC"
int halfLength = hands.Length / 2;
playerOneHands[i] = hands.Substring(0, halfLength);
playerTwoHands[i] = hands.Substring(halfLength + 1); // The remaining part up to the end.
}

如果您知道所有行的长度相同,则可以在开始循环之前计算halfLength

int halfLength = txtImport[0].Length / 2;
for (...

这可以解决您的问题,尽管它不是很健壮:

class Program
{
static void Main(string[] args)
{
string[] txtImport = new string[] { "TS TS TS TS TS 3S 3S 3S 3S 3S",
"KH KH KH KH KH AH AH AH AH AH",
"8C 8C 8C 8C 8C 7D 7D 7D 7D 7D" };
string[] playerOne = new string[999];
string[] playerTwo = new string[999];
int i = 0;

foreach (var item in txtImport)
{
playerOne[i] = item.Substring(0, 14);
playerTwo[i] = item.Substring(15, 14);
i++;
}
}
}

根据您对问题的描述,我知道每张卡都用空格分隔,因此我会使用Split方法并将空格字符指定为分隔符,如下所示:

var line = "8C TS KC 9H 4S 7D 2S 5D 3S AC";
var allCards = line.Split(' ');

其次,我知道你想把前五张牌分配给玩家一,把接下来的五张牌分配给玩家二。我会使用Linq来实现这一点,如下所示:

var playerOneHands = allCards.Take(5);
var playerTwoHands = allCards.Skip(5);

您可以使用 link 在你得到的整个数组上执行此操作:

using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
string[] hands = new[] {
"8C TS KC 9H 4S 7D 2S 5D 3S AC",
"2C TS KC 9H 4S 8D 2S 5D 3S AC",
"3C TS KC 9H 4S 9D 2S 5D 3S AC",
"4C TS KC 9H 4S 6D 2S 5D 3S AC",
"5C TS KC 9H 4S 5D 2S 5D 3S AC",
"6C TS KC 9H 4S 4D 2S 5D 3S AC",
"9C TS KC 9H 4S 3D 2S 5D 3S AC",
"7C TS KC 9H 4S 2D 2S 5D 3S AC",
};
var split = hands
.Select(s => // select is used to split it in first 5 + second 5 using 
new      // IEnumeratble<T>.Take(5) and .Skip(5) after splitting
{        // string.Join glues the splits on " " back together
p1 = string.Join(" ", s.Split(" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries).Take(5)).Trim(),
p2 = string.Join(" ", s.Split(" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries).Skip(5)).Trim()
})
.ToList();
// I provided the stringsplit-options to get rid of "empty" splits on "   ".
var p1 = split.Select(s => s.p1).ToArray();
var p2 = split.Select(s => s.p2).ToArray();
foreach (var t in p1)
Console.WriteLine("P1:   " + t);
Console.WriteLine();
foreach (var t in p2)
Console.WriteLine("P2:   " + t);
Console.ReadLine();
}
}

输出:

P1:   8C TS KC 9H 4S
P1:   2C TS KC 9H 4S
P1:   3C TS KC 9H 4S
P1:   4C TS KC 9H 4S
P1:   5C TS KC 9H 4S
P1:   6C TS KC 9H 4S
P1:   9C TS KC 9H 4S
P1:   7C TS KC 9H 4S
P2:   7D 2S 5D 3S AC
P2:   8D 2S 5D 3S AC
P2:   9D 2S 5D 3S AC
P2:   6D 2S 5D 3S AC
P2:   5D 2S 5D 3S AC
P2:   4D 2S 5D 3S AC
P2:   3D 2S 5D 3S AC
P2:   2D 2S 5D 3S AC

您可以使用String.Split方法拆分文件中的行:

string[] lines = fileText.Split(new[] { Environment.NewLine }, StringSplitOptions.None);

若要获取字符串的前半部分,可以使用String.Substring方法。

List<string> playerOneHands = new List<string>();
List<string> playerTwoHands = new List<string>();
foreach (string line in lines)
{
playerOneHands.Add(line.Substring(0, 14));
playerTwoHands.Add(line.Substring(15, 14));
}