2010-08-13 10 views
9

Czy można napisać zapytanie, w którym otrzymamy wszystkie znaki, które można sparsować w int z dowolnego ciągu?Używanie LINQ do analizowania liczb z ciągu znaków

Na przykład mamy ciąg jak: "$%^DDFG 6 7 23 1"

wynik musi być "67231"

Nawet niewielkie trudniejsze: Czy możemy dostać tylko pierwsze trzy numery?

+2

Dokładny wymóg nie jest do końca jasne, co się stanie z like'123abc456def' smyczkową, czy chcesz, aby powrócić '123456',' 123' i '456', tylko '123' lub może' 1' i '2' i' 3' itp? Najlepsze podejście zależy od dokładnej specyfikacji. –

+2

@Paul mówi pierwsze trzy cyfry. Jak to może być dokładniejsze? Może chcesz napisać 300 stron specyfikacji i jakiś biznesplan z mnóstwem schematów? :) – Agzam

Odpowiedz

20

To daje swój ciąg

string result = new String("y0urstr1ngW1thNumb3rs". 
    Where(x => Char.IsDigit(x)).ToArray()); 

i przez pierwsze 3 znaki używać .Take(3) przed ToArray()

+2

Nie pamiętam, kto pierwszy odpowiedział tym rozwiązaniem. W każdym razie też tu głosuję. Poza tym Alan ma więcej niż 10 000 punktów. – Agzam

10

Następujące elementy powinny działać.

var myString = "$%^DDFG 6 7 23 1"; 

//note that this is still an IEnumerable object and will need 
// conversion to int, or whatever type you want. 
var myNumber = myString.Where(a=>char.IsNumber(a)).Take(3); 

Nie jest jasne, czy chcesz 23 należy uznać za jedną sekwencję liczb, lub 2 różne numery. Moje powyższe rozwiązanie zakłada, że ​​ostateczny wynik ma być następujący: 672

+0

podobne rozwiązanie jak moje oprócz tego, że byłeś szybszy lol :) – Kelsey

+3

Możesz napisać gdzie jako '.Where (char.IsNumber)' Myślę, że ponieważ akceptuje char i zwraca bool - nie ma potrzeby dla lamda. – Rup

+1

@Rup: Cool. Nauczyłem się czegoś nowego. – Alan

1

Co powiesz na coś takiego?

var yourstring = "$%^DDFG 6 7 23 1"; 
var selected = yourstring.ToCharArray().Where(c=> c >= '0' && c <= '9').Take(3); 
var reduced = yourstring.Where(char.IsDigit).Take(3); 
+0

to trochę ciężko przeczytać ... prawda? – Agzam

+0

Myślę, że może to być, jeśli nie znasz wyrażeń LINQ i lambda. –

2
string testString = "$%^DDFG 6 7 23 1"; 
string cleaned = new string(testString.ToCharArray() 
    .Where(c => char.IsNumber(c)).Take(3).ToArray()); 

Jeśli chcesz użyć białej listy (nie zawsze numery) :

char[] acceptedChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
string cleaned = new string(testString.ToCharArray() 
    .Where(c => acceptedChars.Contains(c)).Take(3).ToArray()); 
0

Regex:

private int ParseInput(string input) 
{ 
    System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+"); 
    string valueString = string.Empty; 
    foreach (System.Text.RegularExpressions.Match match in r.Matches(input)) 
     valueString += match.Value; 
    return Convert.ToInt32(valueString); 
} 

Nawet niewielkie trudniejsze: Czy możemy dostać tylko pierwsze trzy numery?

private static int ParseInput(string input, int take) 
    { 
     System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"\d+"); 
     string valueString = string.Empty; 
     foreach (System.Text.RegularExpressions.Match match in r.Matches(input)) 
      valueString += match.Value; 
     valueString = valueString.Substring(0, Math.Min(valueString.Length, take)); 
     return Convert.ToInt32(valueString); 
    } 
3
public static string DigitsOnly(string strRawData) 
    { 
    return Regex.Replace(strRawData, "[^0-9]", ""); 
    } 
+0

ten też miły – Agzam

0
> 'string strRawData="12#$%33fgrt$%$5"; 
> string[] arr=Regex.Split(strRawData,"[^0-9]"); int a1 = 0; 
> foreach (string value in arr) { Console.WriteLine("line no."+a1+" ="+value); a1++; }' 

Output:line no.0 =12 
line no.1 = 
line no.2 = 
line no.3 =33 
line no.4 = 
line no.5 = 
line no.6 = 
line no.7 = 
line no.8 = 
line no.9 = 
line no.10 =5 
Press any key to continue . . . 
Powiązane problemy