将字符串分成由两个字符组成的字符串
问题描述:
我正在阅读包含字母数字值网格的文本文件(请参见下文)。将字符串分成由两个字符组成的字符串
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,然后继续通过电网的剩余部分循环。但是我不知道从哪里开始尝试完成这项任务。任何帮助,将不胜感激。
答
好第一关,你会propably想要的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();
我已经接受你的评论作为答案,因为你的解决方案是围绕现有方法实现最快。 – Nexuz 2014-10-08 14:15:56