我对c#很新。
我从文本文件中导入了一个名为txtImport的数组。其中包含两个玩家的1000个扑克牌,实际上是2000个扑克手。
文件中的每一行结构如下:
8C TS KC 9H 4S 7D 2S 5D 3S AC
前5名是玩家一张牌,第二名5是玩家二牌。
该阵列包含1000手牌。我想将这个阵列分成两个阵列,一个包含玩家的所有牌,一个包含所有玩家二的阵容。因此,每个元素都需要在中间拆分,并删除空格。
我不知道如何去做这件事我已经尝试了很多东西,但没有一个是正确的。我想使用foreach循环遍历每个元素,将其切割成两个,删除中间的空格,然后将剪切字符串的前半部分分配给名为playerOneHands的新数组,并将剪切字符串的后半部分分配到一个名为playerTwoHands的新数组。
但是我完全迷失了语法或者如何在c#中使用它。我想我是从python方式错误地接近它。有人能指出我正确的方向吗?
编辑:
大家好,最终使用代码解决了这个问题:
string[] txtImport = System.IO.File.ReadAllLines(@"C:\Users\Josh\Desktop\C#\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++
}
答案 0 :(得分:3)
使用一些数学。你总是拥有偶数手和奇数个空格。即,字符串的长度总是奇数。使用整数运算,您可以将字符串的长度除以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 (...
答案 1 :(得分:0)
根据您对问题的描述,我理解每张卡都用空格分隔,因此我会使用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);
答案 2 :(得分:0)
这可以解决您的问题,虽然它不是很强大:
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++;
}
}
}
答案 3 :(得分:0)
您可以使用链接在您获得的整个阵列上执行此操作:
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
答案 4 :(得分:0)
您可以使用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));
}