2011-07-18 24 views
6

Dizeyi ayrıştırmaya çalışıyorum ve ":" öğesinden sonra değerin Tamsayı olup olmadığını görmeye çalışıyorum. Tam sayı değilse, dizeden "Test: M" yi kaldırın.Dize ayrıştırma ile Yardım

İşte sahip olduğum örnek dizesi.

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

sonuç

Ben Neredeyse geldin 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

Beklenen girdi ve beklenen çıktıdan daha fazla örnek verebilir misiniz? –

+4

Neden ters mantığı uygulamıyorsunuz? Değer bir tam sayı ise, sonuç dizgesine eklersiniz. – Alexandre

+0

@Alexandre: Tam olarak ne önerdim. Bir "dizgiyi" değiştirmek, "dizge" genişledikçe yavaş olacaktır. Bir 'StringBuilder' kullanımı sonunda sonuçta daha hızlı olacak. – Yuck

cevap

4

Sen döngü yapısı ile devam edebileceğini ama, şahsen, LINQ görünümünü biraz daha iyi gibi:

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 - Başka neyi özlüyorum? –

+0

"Dışarı" anahtar kelimesine inanıyorum. Ayrıca, "outVar" kukla, lambdadan çekilebilirdi, ama bu, lambda'nın gövdesini basitleştirmenin bir yolu değil. – Groo

5

gerekir. Bu kullanmayı deneyin:

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

DÜZENLEME: ... çıktıda virgül tutmak için "," ekleme

DÜZENLEME: Örtülü dize birleştirme önleme hakkında @Groo öneri almak.

+0

Muhtemelen virgülleri de eklemeniz gerekiyor. –

+0

@Tim Coker: Evet! Sadece bunu kaçırdım, teşekkürler. – Yuck

+2

Bir 'StringBuilder' kullandığınızdan, gereksiz birleştirmelerden kaçınmak için ayrı bir satırda builder.Append (',');' yazabilirsiniz. Ayrıca, sonuçtaki dizenin sonunda bir virgül olacak, dolayısıyla bir 'String.Join 'daha iyi bir çözüm olabilir. – 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'nin veriyi çıktı olarak saklamak istediğine inanıyorum. Cevabınız metni konsola gönderir. – Yuck

2

Sadece istenen değerlerle yeni bir koleksiyon inşa edebileceğini ...

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'ler sorun alanında bir kısıtlama olduğunun farkında değildim, ancak yine de örneği güncelledim. –

0

I (stri ellerimde aracı kodlama olmadığını uyarmalıdır, böylece açıkça derlenebilir kodunu size sağlayamaz, ancak fark diğerlerinde ben Böl kullanmayı öneririm ng []), örneğin: Bölünmüş (yeni dize [] {",", ":"}) ve çağrıyı 2 kez bölmekten kaçının. Bundan sonra, dizinin hangi dizinlerinin tam sayı olduğunu net bir şekilde göreceksiniz. Örneğinizde her N * 3 olmalıdır. Bu arada test etmeniz gerekiyor.

Bu yardımcı olur umarım.

Saygılarımızla.