2011-07-18 67 views
6

我想解析字符串,看看「:」後面的值是不是整數。如果它不是整數,則從字符串中除去「Test:M」。字符串解析幫助

這是我有的示例字符串。

string testString = "Test:34,Test:M"; 

結果我需要testString = "Test:34"

string[] data = testString.Split(','); 
for (int i = 0; i < data.Length; i++) 
{ 
    string[] data1 = data[i].Split(':'); 
    int num = 0; 
    if(Int32.TryParse(data1[1], out num)) 
    { 

    } 
} 
+0

您能舉出更多預期投入和預期產出的例子嗎? –

+4

你爲什麼不實施相反的邏輯?如果該值是一個整數,則將其附加到結果字符串中。 – Alexandre

+0

@Alexandre:正是我提出的。字符串越大,修改'string'的速度就越慢。使用'StringBuilder'最終會變得更快。 – Yuck

回答

4

你可以繼續與循環結構,但我個人喜歡看LINQ的好一點:

var dummy = 0; 

var intStrings = 
    testString.Split(',') 
     .Where(s => s.Contains(":") && int.TryParse(s.Split(':')[1], out dummy)) 
     .ToArray(); 

var result = String.Join(",", intStrings); 
+0

+1如果你修復這些錯誤。 – Groo

+0

@格羅 - 我還缺少什麼? –

+0

我相信一個'out'關鍵字。此外,虛擬'outVar'可能會被拉出lambda,但這不是錯誤,只是一種簡化lambda身體的方法。 – Groo

5

你幾乎沒有。嘗試使用這樣的:

var builder = new StringBuilder(); 
    string[] data = testString.Split(','); 
    for (int i = 0; i < data.Length; i++) 
    { 
     string[] data1 = data[i].Split(':'); 
     int num = 0; 
     if(Int32.TryParse(data1[1], out num)) 
     { 
      builder.Append(data[i]); 
      buidler.Append(','); 
     } 
    } 

    testString = builder.ToString(); 

編輯:添加","保持逗號輸出...

編輯:以@Groo建議上避免隱含的字符串連接。

+0

您可能還需要在逗號中添加。 –

+0

@Tim Coker:是的!我剛想錯過,謝謝。 – Yuck

+2

由於您使用的是StringBuilder,因此您也可以在單獨的行中編寫builder.Append(',');以避免不必要的連接。而且,在結果字符串的末尾會有一個逗號,所以'String.Join'可能是一個更好的解決方案。 – Groo

1
 string testString = "Test:34,Test:M,Crocoduck:55"; 
     string[] data = testString.Split(','); 
     for (int i = 0; i < data.Length; i++) 
     { 
      string s = data[i].Remove(0, data[i].IndexOf(':') + 1); 
      int num; 
      if (Int32.TryParse(s, out num)) 
      { 
       Console.WriteLine(num); 
      } 
     } 
+0

我相信OP想要保留字符串數據作爲輸出。您的答案將文本轉儲到控制檯。 – Yuck

2

你可以只建立一個新的集合與所需的值...

string testString = "Test:34,Test:M, 23:test"; 

int temp = default(int); 

var integerLines = from line in testString.Split(',') 
        let value = line.Split(':').ElementAt(1) 
        let isInteger = Int32.TryParse(value, out temp) 
        where isInteger 
        select line; 
+0

@Groo我不知道這是OPs問題域的一個約束,但我更新了示例。 –

0

我要提醒那些沒有在我的手上編碼工具,所以不能爲您提供 顯然編譯代碼,但在差異別人我會建議使用斯普利特(STRI例如:Split(新字符串[] {「,」,「:」})並避免呼叫拆分2次。在此之後,您將清楚地看到數組的哪些索引是整數。在你的例子中,它應該是每個N * 3。順便說一句,你需要測試它。

希望這會有所幫助。

問候。