如何将分隔符计数作为输入

本文关键字:输入 分隔符 | 更新日期: 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.SplitStringSplitOptions.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