如何将分隔符计数作为输入
本文关键字:输入 分隔符 | 更新日期: 2023-09-27 18:04:09
在程序中,我必须处理这样一个输入表。
a:1
b:2
c:3
?:6
#:14
显然,分隔符是":"answers"'n"
但是,像这样的输入将捕获异常::2
我想让':' store也变成一个char列表
如何修改这些代码?我该把试接球放哪儿呢?
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);
}
首先需要逐行解析文本。对
使用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
中,如果是这种情况,只需先通过换行符分割文本,然后迭代行并做同样的事情。
您可以使用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