C# 一次读取3个字符的字符串
想象一下这个字符串:C# 一次读取3个字符的字符串,c#,string,split,C#,String,Split,想象一下这个字符串: _ _ _ _ _ _ _ | _| _||_||_ |_ ||_||_| ||_ _| | _||_| ||_| _| 拆分此字符串的最简单/最好的方法是什么,这样每个数字都可以自己处理 我在想类似的事情 public string[] SplitIntoNumbers(string input) 结果会是什么样子 [" | |", " _ _||_ ", " _ _| _|", ...] 有什么想法吗 编
_ _ _ _ _ _ _
| _| _||_||_ |_ ||_||_|
||_ _| | _||_| ||_| _|
拆分此字符串的最简单/最好的方法是什么,这样每个数字都可以自己处理
我在想类似的事情
public string[] SplitIntoNumbers(string input)
结果会是什么样子
[" | |", " _ _||_ ", " _ _| _|", ...]
有什么想法吗
编辑对于想要更多信息的千人来说,问题来自于。我意识到“完成工作”有多种方法——解决方案,但我觉得必须有一种更“奇特”的方法来解决它。相似的东西 我会使用正则表达式建立一个匹配列表,其模式与此类似
(.{3})
这将把输入分成3x1个匹配的块,并根据您有多少个匹配来确定数字。比如说
_ _ _ _ _ _ _
| _| _||_||_ |_ ||_||_|
||_ _| | _||_| ||_| _|
将生成27个3x1段的匹配,由于每个数字有3行高,您可以只取27/3=9个单独的数字。然后,只需循环遍历正则表达式匹配项,并将它们组合到所需的输出中
void Main()
{
string input = " _ _ _ _ _ _ _ \r\n | _| _||_||_ |_ ||_||_|\r\n ||_ _| | _||_| ||_| _|";
string[] result = SplitIntoNumbers(input);
}
public string[] SplitIntoNumbers(string input)
{
List<string> results = new List<string>();
Regex rx = new Regex("(.{3})");
MatchCollection matches = rx.Matches(input);
int totalNumbers = matches.Count / 3;
for(int i = 0; i < totalNumbers; i++)
{
string s = string.Concat(matches[i].Value, matches[i + totalNumbers].Value, matches[i + (totalNumbers * 2)].Value);
results.Add(s);
}
return results.ToArray();
}
void Main()
{
字符串输入=“uuuuuuuuuuuuuuuuuuuuuuuuuuuu124; uu124 124; u124; u124 124; u124; u124 124; u124; u124 124;\r\n | | | | | | | | | | | | | | | | | | |”;
字符串[]结果=拆分为数字(输入);
}
公共字符串[]拆分为数字(字符串输入)
{
列表结果=新列表();
Regex rx=新的Regex(“({3})”;
MatchCollection matches=rx.matches(输入);
int totalNumbers=匹配项。计数/3;
对于(int i=0;i
直截了当地说:
public static string[] SplitIntoNumbers(string input)
{
List<string> result = new List<string>();
string[] subStrs = input.Split(new char[] { '\r', '\n' }, 3, StringSplitOptions.RemoveEmptyEntries);
for (int it = 0; it < subStrs[0].Length; it += 3)
{
result.Add(subStrs[0].Substring(it, 3)
+ subStrs[1].Substring(it, 3)
+ subStrs[2].Substring(it, 3));
}
return result.ToArray();
}
假设您希望保留字符串数组以供输入,我们可以非常简单地通过一次提取3个字符的行进行循环
var numbers = new[]
{
" _ _ _ _ _ _ _ ",
" | _| _||_||_ |_ ||_||_|",
" ||_ _| | _||_| ||_| _|"
};
// just in case length is off on one, don't want to crash
var length = numbers.Min(line => line.Length);
var results = new List<string>();
// go by groups of three
for (int i = 0; i < length; i += 3)
{
var builder = new StringBuilder();
for (int j = 0; j < numbers.Length; j++)
{
builder.Append(numbers[j].Substring(i, 3));
}
results.Add(builder.ToString());
}
// print the results
foreach (var digit in results)
{
Console.WriteLine(digit);
}
var number=new[]
{
" _ _ _ _ _ _ _ ",
" | _| _||_||_ |_ ||_||_|",
" ||_ _| | _||_| ||_| _|"
};
//以防万一长度在1上有偏差,我不想崩溃
变量长度=numbers.Min(line=>line.length);
var results=新列表();
//三人一组去
对于(int i=0;i
您问:
拆分此字符串的最简单/最好的方法是什么,这样每个数字都可以自己处理
。。。我认为您可能从OO的角度来处理这个问题。你所说的其实是一种“字体”,而不是一组字符。坦率地说,我只是将逻辑封装到一个类中,并像您在本文中所做的那样定义字符数据。它易于查看、编辑和维护
从你最初的帖子中,我不明白你的最终目标是渲染还是解析。无论如何,我不能只停留在数字上;)
扩展方法如何:
public static string[] SplitIntoNumbers(this string str)
{
var lines = str.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
var columns = lines
.Select(x => x.InSetsOf(3).Select(y => new string(y.ToArray())).ToList())
.ToList();
var numbers = Enumerable.Range(0, columns[0].Count)
.Select(x => columns[0][x] + columns[1][x] + columns[2][x])
.ToArray();
return numbers;
}
假设是可用的
用法:
var result = input.SplitIntoNumbers();
您必须使用字符串输入,还是可以使用Nx3字符数组,然后在3x3字符结构中拆分每个组?这里对字符串的解释是什么(它们实际上是用来处理一维字符串的,其中每个字符代表一个字符)?你能写一个例子吗?另请看我得到的
索引AutoFrangeException
——将你使用的输入字符串添加到你的问题中。有创意,我想它会起作用,但我真的很想在这张牌上玩老牌:-)
_ _ _ _ _ _ _ _
_ | _| _||_||_ |_ ||_||_|| |
___ ||_ _| | _||_| ||_| _||_|
-_ 1234567890
_ _ _ _ _ _ _
|_||_ | _||_ |_ | |_| | ||/ | |\|
| ||_||_ |_||_ | |_-| | | _||\ |_ |||
abcdefghijklm
_ _ _ _ ___ __
|\| _ |_||_||_|/_ | | || |||| \/ \/ /
| ||_|| ||\ _/ | |_||/ |/| /\ | /_
nopqrstuvwxyz
public static string[] SplitIntoNumbers(this string str)
{
var lines = str.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
var columns = lines
.Select(x => x.InSetsOf(3).Select(y => new string(y.ToArray())).ToList())
.ToList();
var numbers = Enumerable.Range(0, columns[0].Count)
.Select(x => columns[0][x] + columns[1][x] + columns[2][x])
.ToArray();
return numbers;
}
var result = input.SplitIntoNumbers();