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

时间:2018-03-04 22:28:07

标签: c# .net

我对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++
            }

5 个答案:

答案 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));
}