Etwas, das ich immer mehr mache, ist das Überprüfen einer Zeichenfolge auf Leerzeichen (wie in ""
oder null) und einen bedingten Operator.
Ein aktuelles Beispiel:
s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
Dies ist nur eine Erweiterungsmethode, die entspricht:
string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
Da es leer und nicht null ist, reicht ??
es nicht aus. Eine string.IsNullOrEmpty()
Version von ??
wäre die perfekte Lösung. Ich denke, es muss einen saubereren Weg geben, dies zu tun (ich hoffe!), Aber ich war ratlos, es zu finden.
Kennt jemand einen besseren Weg, dies zu tun, auch wenn es nur in .Net 4.0 ist?
c#
string
coalesce
null-coalescing-operator
Nick Craver
quelle
quelle
let (|?) x y = if String.IsNullOrEmpty(x) then y else x
und benutze es gernes.SiteNumber |? "No Number"
.Antworten:
Es gibt keine eingebaute Möglichkeit, dies zu tun. Sie können Ihre Erweiterungsmethode jedoch dazu bringen, eine Zeichenfolge oder null zurückzugeben, damit der Koaleszenzoperator arbeiten kann. Dies wäre jedoch seltsam, und ich persönlich bevorzuge Ihren derzeitigen Ansatz.
Da Sie bereits eine Erweiterungsmethode verwenden, können Sie eine erstellen, die den Wert oder einen Standardwert zurückgibt:
quelle
???
Operator in C # 5 lieben , wer weiß.item ?? x=> x.ToString() : null;
C # schon können wir für Werte ersetzen
null
mit??
. Wir brauchen also nur eine Erweiterung, die eine leere Zeichenfolge in konvertiertnull
, und dann verwenden wir sie wie folgt :Erweiterungsklasse:
quelle
Ich weiß, dass dies eine alte Frage ist - aber ich suchte nach einer Antwort und keine der oben genannten Fragen entsprach meinen Bedürfnissen und dem, was ich letztendlich verwendet habe:
Verwendung:
EDIT: Eine noch kompaktere Art, diese Funktion zu schreiben, wäre:
quelle
using System.Linq
Ich habe einige Dienstprogrammerweiterungen, die ich gerne verwende:
Bearbeiten: Inspiriert von der Antwort von sfsr werde ich diese Variante von nun an zu meiner Toolbox hinzufügen:
quelle
@
Präfix des@default
Parameters? Das habe ich noch nie gesehen.default
einen Variablennamen verwenden, obwohl es sich um ein reserviertes Schlüsselwort in C # handelt.Eine etwas schnellere Verlängerungsmethode als früher vorgeschlagen:
quelle
code
öffentliche statische Zeichenfolge Coalesce (diese Zeichenfolge @this, Zeichenfolge @default = "") {return (@this == null || String.IsNullOrWhiteSpace (@this))? @default: @this; }Einer der Vorteile des Null-Koaleszenz-Operators besteht darin, dass er kurzschließt. Wenn der erste Teil nicht null ist, wird der zweite Teil nicht ausgewertet. Dies kann nützlich sein, wenn der Fallback eine teure Operation erfordert.
Am Ende hatte ich:
Verwendung:
quelle
Ich verwende einfach eine NullIfEmpty-Erweiterungsmethode, die immer null zurückgibt, wenn die Zeichenfolge leer ist. (Null Coalescing Operator) wird wie gewohnt verwendet.
Dies ermöglicht dann? Wird wie gewohnt verwendet und ist leicht zu lesen.
quelle
Wie wäre es mit einer String-Erweiterungsmethode ValueOrDefault ()
oder geben Sie null zurück, wenn die Zeichenfolge leer ist:
Ich habe diese Lösungen jedoch nicht ausprobiert.
quelle
...OrDefault()
wäre verwirrend, wenn es sich nicht wie die übrigen...OrDefault()
Methoden des Frameworks verhalten würde . Ob es Ihnen gefällt oder nicht, MS hat dieser Benennung eine bestimmte Bedeutung gegeben, und die Abweichung von diesem Verhalten bei benutzerdefinierten Methoden ist für Benutzer Ihrer API unnötig verwirrend.Ich verwende eine eigene String-Coalesce-Erweiterungsmethode. Da die hier LINQ verwenden und Ressourcen für zeitintensive Operationen verschwenden (ich verwende es in engen Schleifen), werde ich meine teilen:
Ich denke, es ist ganz einfach, und Sie müssen sich nicht einmal mit Null-String-Werten beschäftigen. Verwenden Sie es so:
Ich benutze es oft. Eine dieser "Utility" -Funktionen, auf die Sie nach der ersten Verwendung nicht mehr verzichten können :-)
quelle
s2.Coalesce(s3)
Programm auch dann ausgeführt, wenn es nicht benötigt wird. Besser eineNullIfEmpty()
Erweiterung verwenden und??
.Ich mag die Kürze der folgenden Erweiterungsmethode
QQQ
dafür, obwohl natürlich ein Operator wie? wäre besser. Wir können dies jedoch verbessern, indem wir nicht nur zwei, sondern drei Zeichenfolgenoptionswerte vergleichen lassen, auf die hin und wieder verzichtet werden muss (siehe zweite Funktion unten).quelle
Or
, und ich würde dasparams
Schlüsselwort wie die anderen Antworten verwenden, wodurch doppelte Definitionen für mehrere Parameter vermieden werden.params
, es ist besser, dies nicht für das Standard-Szenario oder zwei zu tun, daparams
ein Array unnötig zugewiesen wird, wenn Sie nur die Standardeinträge ein oder zwei haben. Danach macht es Sinn.