2011-01-06 10 views
33

int.TryPrase ist groß und alle, aber es gibt nur ein Problem ... es mindestens zwei Zeilen Code nimmt zu verwenden:int.TryParse syntaktischen Zucker

Ich mag etwas tun kann
int intValue; 
string stringValue = "123"; 
int.TryParse(stringValue, out intValue); 
.... 

Natürlich:

string stringValue = "123"; 
int intValue = Convert.ToInt32(string.IsNullOrWhiteSpace(stringValue) ? 0 : stringValue); 

auf nur einer Zeile Code.

Wie kann ich etwas Magie machen, um int.TryParse zu bekommen, um einen einzigen Liner zu verwenden, oder gibt es noch eine dritte Alternative da draußen?

Vielen Dank!

Bezden beantwortete die Frage am besten, aber in Wirklichkeit plane ich Reddogs Lösung zu verwenden.

+0

Während ein wenig zu spät zu dieser Party ... Ich bin vollkommen einverstanden, wäre es schön, TryParse als Motto zu haben, aber die Vorschläge hier sind nicht sehr schön. C# 6.0 hatte einen Sprachvorschlag, der diese Syntax erlaubt hätte ... bool result = int.TryParse ("123", out int value); // value = 123 – series0ne

+0

Related: Wenn Sie int Int int? du kannst 'int.TryParse (" string ", out int result)? result: result', so wird der Compiler nicht verrückt – smurtagh

Antwort

53
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0; 
+8

Schön. Das einzige Problem ist natürlich, dass Sie nicht zwischen einem schlechten Wert und einer 0 in der Eingabe-Zeichenfolge unterscheiden können ... es entfernt den Punkt der Verwendung von TryParse() –

+1

Nizza. Ich kann es graben. –

+0

schlägst du mich dazu :). +1 für dieselbe Lösung :) –

0

Ich glaube nicht, dass es etwas wirklich schön, aber wenn Sie so Sie es auf eine Zeile nach unten:

string stringValue = "123" 
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0; 
37

Vielleicht eine Erweiterungsmethode verwenden:

public static class StringExtensions 
{ 
    public static int TryParse(this string input, int valueIfNotConverted) 
    { 
     int value; 
     if (Int32.TryParse(input, out value)) 
     { 
      return value; 
     } 
     return valueIfNotConverted; 
    } 
} 

Und Verwendung:

string x = "1234"; 
int value = x.TryParse(0); 

Bearbeiten: Und natürlich können Sie die offensichtliche Überladung hinzufügen, die bereits den Standardwert auf Null setzt, wenn das Ihr Wunsch ist.

+1

+1 Vielleicht möchten Sie die Verwendung 'int x =" 123 ".TryParse (1);' –

+0

Ich wollte die gleiche Lösung wie oben mit int num = "123" hinzufügen. ToInt(); aber du warst schneller! dafür erhalten +1 – Delashmate

1

Sie wollen nicht int.TryParse() eine Zeile machen. Warum? Weil Sie keine Zuweisung zu intValue vornehmen können, wenn die Eingabezeichenfolge keine gültige ganze Zahl ist. Der ganze Sinn von TryParse() besteht darin, Ihnen zu erlauben, auf eine gute Eingabe zu testen und sie auf würdige Weise zu degradieren, anstatt eine Ausnahme abfangen zu müssen.

Int.TryParse() ist bereits eine Verknüpfung, so dass Sie nicht für ein gültiges int testen müssen und die Zuweisung in zwei Schritten tun ... das ist so weit wie Sie es wollen.

+0

Danke, aber ich stimme nicht zu allen Ihren Punkten. Sie sind einfach nicht wahr. –

+3

Fair genug:) –

0

Da es im Wesentlichen zwei Werte zurückgibt (Erfolg und der Wert), brauchen wir wirklich die zwei Zeilen.

Sie könnten eine Wrapper-Klasse versuchen, das heißt:

void Main() 
{ 
    var result = simpleIntParser.TryParse("1"); 
    if(result) 
    { 
     Console.WriteLine((int)result); 
    } else { 
     Console.WriteLine("Failed"); 
    } 

    result = simpleIntParser.TryParse("a"); 
    if(result) 
    { 
     Console.WriteLine((int)result); 
    } else { 
     Console.WriteLine("Failed"); 
    } 


} 

public class simpleIntParser 
{ 
    public bool result {get; private set;} 
    public int value {get; private set;} 

    private simpleIntParser(bool result, int value) 
    { 
     this.result = result; 
     this.value = value; 
    } 

    public static simpleIntParser TryParse(String strValue) 
    { 
     int value; 
     var result = int.TryParse(strValue, out value); 
     return new simpleIntParser(result, value); 
    } 

    public static implicit operator int(simpleIntParser m) 
    { 
     return m.value; 
    } 

    public static implicit operator bool(simpleIntParser m) 
    { 
     return m.result; 
    } 
} 

Es erfordert Gießen, wenn der Typ (dh für Console.WriteLine()) nicht eindeutig ist, aber wenn Sie es als ein Integer-Parameter zum Beispiel passieren, kein Gießen ist erforderlich

+0

Whoa whoaaaaa, warte was ist .Dump()? –

+0

Es ist von linqPad, sorry. Es druckt es nur auf dem Bildschirm. – Rob

3

Ich würde eine Erweiterung Methode aus diesem erstellen.

public static int? AsInt32(this string s) 
    { 
     int value; 
     if (int.TryParse(s, out value)) 
      return value; 

     return null; 
    } 
+0

Dies ist die beste Lösung hier, weil in einer Zeile wir den erfolgreich geparsten Wert erhalten und wir können immer noch unterscheiden zwischen einer Zeichenfolge, die nicht analysiert und die Zeichenfolge "0" –

1

Überprüfen Sie die StringExtensions Klasse. Es enthält eine Erweiterungsmethode AsInt(String,Int32), die versuchen wird, eine Zeichenfolge zu konvertieren, und wenn sie nicht erfolgreich ist, wird sie mit dem angegebenen Int32-Wert als Standard ausgefüllt.

Beispiel:

var intValue = "123".AsInt(-1); 
+0

Ich habe diese Methode nicht standardmäßig verfügbar? (.net Framework 4.5) – Muflix

0
int val2 = "asd".AsInt(-1); 
//Output : -1 
int val3 = "123".AsInt(-1); 
//Output : 123 

Sie müssen System.Web.WebPages Namensraum haben.

1

Diese Antwort ist nur für diejenigen, die mindestens C# 7 verwenden.

Sie können jetzt den out-Parameter inline deklarieren.

int.TryParse("123", out var result); 

Um zu beweisen, dass es funktioniert, können Sie folgende Dotnetfiddle ausführen.

int.TryParse("123", out var result); 
Console.WriteLine(result); 
Console.WriteLine(result.GetType()); 

https://dotnetfiddle.net/nn9955

Verwandte Themen