将一行字符串拆分为由两个字符组成的字符串

本文关键字:字符串 字符 两个 一行 拆分 | 更新日期: 2023-09-27 18:25:52

我正在读取一个文本文件,该文件由一个字母-数字值网格组成(见下文)。

IQQQQQ
WG2223
S22228
D22223

目前,这些值被循环使用,每个字符都被发送到一个开关案例中。然后,此开关读取该字符并输出给定的结果。此过程的代码如下。

private void LoadLevel(Stream stream)
{
     List<string> lines = new List<string>();
     uint width;
     using (StreamReader reader = new StreamReader(stream))
     {
           string line = reader.ReadLine();
           width = (uint)line.Length;
           while (line != null)
           {
                lines.Add(line);    
                line = reader.ReadLine();
           }
    }
    tiles = new Tile[width, lines.Count];
    for (int y = 0; y < Height; ++y)
    {
        for (int x = 0; x < Width; ++x)
        {
             char type = lines[y][x];
             tiles[x, y] = LoadTile(type, x, y);
        }
    }
}

在这段代码中,我检索文本文件并将每一行存储在列表中,然后循环遍历每一行并提取网格中给定点的每个字符。我希望同时提取两个字符,并将其传递给LoadTile函数,而不是提取一个字符。

以网格的第一行为例。

IQQQQQ

我想把这一行分成三个字符串,每个字符串长两个字符,然后把它传递给LoadTile,然后继续循环遍历网格的其余部分。然而,我不知道从哪里开始尝试实现这项任务。如有任何帮助,我们将不胜感激。

将一行字符串拆分为由两个字符组成的字符串

首先,您可能希望将LoadTile的签名从LoadTile(char, int, int)更改为LoadTile(string, int, int)。然后将宽度的计算更改为

width = line.Length/2;

当然,如果任何一行有奇数个字符,你就会失去最后一个字符。此外,如果第一行之后的任何一行较短,则会出现异常,如果较长,则会丢失额外的数据。

然后,您可以像这样循环并获取子字符串。

for (int y = 0; y < Height; ++y)
{
    for (int x = 0; x < Width; ++x)
    {
         string type = lines[y].Substring(x*2,2);
         tiles[x, y] = LoadTile(type, x, y);
    }
}

您可以这样做:

var str = "IQQQQQ";
var arr = Regex.Matches(str, "..").Cast<Match>().ToArray().Select(u => u.Value);
// arr[0] = "IQ" 
// arr[1] = "QQ"
// arr[2] = "QQ"

这就是获取子字符串的方法:

var item = source.Substring(i * 2, 2);

您可以在一行中拆分为阵列:

var split = Enumerable.Range(0,3).Select(i=>source.Substring(i * 2, 2)).ToArray();
for (var i = 0; i < 3; i++)
{
    var item = split[i];
    // ...
}

使用LinQ。试着对每一行都这样做:

//Converts the string to a List of strings
List<string> stringArray = line.ToCharArray().Select(c=>c.ToString()).ToList();
//Iterates over the list and concats every pair of elements
List<string> result = stringArray.Select((value, index) => new { value, index })
    .GroupBy(x => x.index / 2, x => x.value).Select(pair => pair.Aggregate((s1,s2) => s1 + s2)).ToList();