在程序中,我必须处理这样的输入表。
a:1
b:2
c:3
?:6
#:14
显然,分隔符是":"和" \ n"
但是,像这样的输入会捕获异常
::2
我想制作':'也存储在一个字符列表中。
我该如何修改这些代码? 我应该把try-catch放在哪里?
String[] str;
str = textbox.Text.Trim().Split(':', '\n');
for (i = 0; i < str.Length; i = i + 2){
char tempC;
float tempFreq;
if (char.TryParse(str[i], out tempC))
c.Add(tempC);
if (float.TryParse(str[i + 1], out tempFreq))
freq.Add(tempFreq);
}
答案 0 :(得分:0)
首先,您需要逐行解析文本。使用Lines
属性
然后您可以检查当前行是否以:
var lines = textbox.Lines;
foreach(var line in lines)
{
if(line.StartsWith(':'))
{
c.Add(':');
float tempFreq;
if (float.TryParse(line.Split(':').Last(), out tempFreq))
freq.Add(tempFreq);
}
else
{
char tempC;
float tempFreq;
string[] parts = line.Split(':');
if (char.TryParse(parts[0], out tempC))
c.Add(tempC);
if (float.TryParse(parts[1], out tempFreq))
freq.Add(tempFreq);
}
}
顺便说一句,我认为它是WinForms
,Lines
属性可能不存在于WPF
中,如果是这种情况只是先用换行符分割文本,然后遍历这些行并做同样的事情。
答案 1 :(得分:0)
您可以将String.Split
与StringSplitOptions.RemoveEmptyEntries
一起使用,也可以先拆分行。
包含边缘案例的样本数据
var text = @"a:1
b:2
c:3
?:6
::2
#:14 ";
LINQ查询,它选择char和float作为对:
float freq = 0;
string[] lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
var lineTokens = lines.Select(l => l.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries))
.Where(arr => arr.Length == 2 && arr[0].Trim().Length == 1 && float.TryParse(arr[1].Trim(), out freq))
.Select(arr => new { chr = arr[0].Trim()[0], freq });
输出:
foreach(var x in lineTokens)
Console.WriteLine("Char:{0} Frequency:{1}", x.chr, x.freq);
Char:a Frequency:1
Char:b Frequency:2
Char:c Frequency:3
Char:? Frequency:6
Char:# Frequency:14