2011-07-18 36 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

@アレクサンドル:まさに私が提案したもの。 'string'の修正は、' 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

@Groo - 他に何が欠けていますか? –

+0

私は 'out'キーワードを信じています。また、ダミーの 'outVar'はラムダから引き出されるかもしれませんが、ラムダのボディを単純化する方法はエラーではありません。 – 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(); 

EDIT:...出力にコンマを保つために","を追加

EDIT:暗黙の文字列の連結を避けることに@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私はOP問題ドメインの制約だとは知らなかったが、とにかく例を更新した。 –

0

STRI(私は私の手の上にツールをコーディングする必要はありませんので、 明確にコンパイルコードを提供することはできませんという警告する必要がありますが、違いの他に、私はスプリットを使用することをお勧めしますSplit(新しい文字列[] {"、"、 ":"}))を呼び出し、2回の呼び出し分割を避けます。この後、配列のインデックスが整数であることが明確にわかります。あなたの例では、すべてのN * 3でなければなりません。あなたはそれをテストする必要があります。

これが役に立ちます。

よろしくお願いいたします。