2010-08-13 17 views
9

Ist es möglich, eine Abfrage zu schreiben, wo wir alle Zeichen erhalten, die von einer gegebenen Zeichenfolge in int interpretiert werden könnten?Verwenden von LINQ zum Analysieren der Zahlen aus einer Zeichenfolge

Zum Beispiel haben wir eine Zeichenfolge wie: "$%^DDFG 6 7 23 1"

Ergebnis "67231"

sein muss und sogar leichte härter: Können wir nur die ersten drei Zahlen bekommen?

+2

Die genaue Anforderung nicht ganz klar ist, was mit einem String like'123abc456def' passieren würde, tun Sie 123456' 'zurückkehren möchten,' 123' und '456', nur '123' oder vielleicht' 1' und '2' und' 3' etc? Der beste Ansatz hängt von der genauen Spezifikation ab. –

+2

@Paul sagt die ersten drei Zahlen. Wie genau könnte das genauer sein? Vielleicht möchten Sie, dass ich 300 Seiten mit Spezifikationen und irgendeinen Geschäftsplan mit einer Reihe von Diagrammen schreibe? :) – Agzam

Antwort

20

Dadurch werden Sie Ihre Zeichenfolge

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

geben und für die ersten 3 Zeichen verwenden .Take(3) vor ToArray()

+2

Ich kann mich nicht erinnern, wer zuerst mit dieser Lösung geantwortet hat. Wie auch immer, ich stimme hier auch zu. Außerdem hat Alan mehr als 10k Punkte. – Agzam

10

Folgendes sollte funktionieren.

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

Es ist nicht klar, ob Sie 23 wollen eine einzige Zahlenfolge, oder 2 verschiedene Zahlen in Betracht gezogen werden. Meine obige Lösung geht davon aus, dass Sie das Endergebnis haben möchten 672

+0

ähnliche Lösung wie meine außer Sie waren waaay schneller lol :) – Kelsey

+3

Sie können schreiben, wo als '.Where (char.IsNumber)' Ich denke, da es ein Zeichen akzeptiert und eine bool - keine Notwendigkeit für die Lamda. – Rup

+1

@Rup: Cool. Etwas Neues gelernt. – Alan

1

Wie wäre es mit so etwas?

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

das ist irgendwie schwer zu lesen .. oder? – Agzam

+0

Ich denke, es könnte sein, wenn Sie LINQ und Lambda-Ausdrücke nicht kennen. –

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

Wenn Sie eine weiße Liste verwenden möchten (nicht immer Zahlen) :

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

Und sogar leichte härter: Können wir nur die ersten drei Zahlen bekommen?

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

das ist auch schön – 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 . . . 
Verwandte Themen