2014-05-18 17 views
0

在程序中,我必須像這樣處理輸入表。如何將分隔符計數作爲輸入?

a:1 
b:2 
c:3 
?:6 
#:14 

顯然,分隔符 「:」 和 「\ n」

然而,這樣的投入將捕捉異常

::2 

我要讓 ':' 店,變成一個char列表以及。

我該如何修改這些代碼? 我應該在哪裏放置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

首先,你需要解析由line.Use您的文本行的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,如果是這種情況,只是先用換行符分割文本,然後遍歷行並執行相同的操作。

0

您可以使用String.SplitStringSplitOptions.RemoveEmptyEntries,也可以先分割線。

與邊緣的情況下你的樣本數據

var text = @"a:1 
b:2 
c:3 
?:6 
::2 
#:14 "; 

LINQ查詢,其選擇炭和浮作爲對:

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 
相關問題