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

时间:2014-05-18 21:54:49

标签: c# delimiter

在程序中,我必须处理这样的输入表。

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);

}

2 个答案:

答案 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);
    } 
}

顺便说一句,我认为它是WinFormsLines属性可能不存在于WPF中,如果是这种情况只是先用换行符分割文本,然后遍历这些行并做同样的事情。

答案 1 :(得分:0)

您可以将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