Coś, co robię coraz częściej, to sprawdzanie ciągu znaków pod kątem pustego (jak in ""
lub null) i operatora warunkowego.
Aktualny przykład:
s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
To jest tylko metoda rozszerzenia, jest odpowiednikiem:
string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
Ponieważ jest pusty i nie jest pusty, ??
nie załatwi sprawy. string.IsNullOrEmpty()
Wersja ??
byłoby idealnym rozwiązaniem. Myślę, że musi być na to czystszy sposób (mam nadzieję!), Ale nie mogłem go znaleźć.
Czy ktoś zna lepszy sposób na zrobienie tego, nawet jeśli jest to tylko w .Net 4.0?
c#
string
coalesce
null-coalescing-operator
Nick Craver
źródło
źródło
let (|?) x y = if String.IsNullOrEmpty(x) then y else x
i używaj go jaks.SiteNumber |? "No Number"
.Odpowiedzi:
Nie ma na to wbudowanego sposobu. Możesz jednak sprawić, by metoda rozszerzenia zwracała ciąg lub wartość null, co pozwoliłoby na działanie operatora łączenia. Byłoby to jednak dziwne i osobiście wolę Twoje obecne podejście.
Ponieważ używasz już metody rozszerzającej, dlaczego nie utworzyć takiej, która zwraca wartość lub wartość domyślną:
źródło
???
operator w C # 5, kto wie.item ?? x=> x.ToString() : null;
C # już pozwala nam podstawiać wartości
null
z??
. Potrzebujemy więc tylko rozszerzenia, które konwertuje pusty ciąg nanull
, a następnie używamy go w następujący sposób:Klasa rozszerzenia:
źródło
Wiem, że to stare pytanie - ale szukałem odpowiedzi i żadne z powyższych nie pasowało do moich potrzeb, a także tego, z czego ostatecznie skorzystałem:
Stosowanie:
EDYCJA: Jeszcze bardziej zwarty sposób zapisu tej funkcji to:
źródło
using System.Linq
Mam kilka rozszerzeń narzędzi, których lubię używać:
Edycja: Zainspirowany odpowiedzią sfsr , od teraz będę dodawać ten wariant do mojego zestawu narzędzi:
źródło
@
prefiks@default
parametru? Nigdy wcześniej tego nie widziałem.default
jako nazwy zmiennej, mimo że jest to zastrzeżone słowo kluczowe w C #.Być może nieco szybsza metoda rozszerzenia niż proponowana wcześniej:
źródło
code
publiczny ciąg statyczny Coalesce (ten ciąg @this, string @default = "") {return (@this == null || String.IsNullOrWhiteSpace (@this))? @default: @this; }Jedną z zalet operatora koalescencji zerowej jest to, że powoduje zwarcia. Gdy pierwsza część nie jest pusta, druga nie jest oceniana. Może to być przydatne, gdy powrót wymaga kosztownej operacji.
Skończyło się na:
Stosowanie:
źródło
Po prostu używam metody rozszerzenia NullIfEmpty, która zawsze zwraca wartość null, jeśli ciąg jest pusty, co pozwala? (Operator Null Coalescing) do normalnego użycia.
To pozwala? do normalnego użytku i sprawia, że łańcuchy są łatwe do odczytania.
źródło
co powiesz na metodę rozszerzenia ciągu ValueOrDefault ()
or return null jeśli string jest Empty:
Nie próbowałem jednak tych rozwiązań.
źródło
...OrDefault()
byłoby mylące, gdyby nie zachowywało się jak reszta...OrDefault()
metod frameworka . Czy nam się to podoba, czy nie, MS nadało określone znaczenie temu nazewnictwie i odstępowanie od tego zachowania w metodach niestandardowych jest niepotrzebnie mylące dla użytkowników twojego API.Używam własnej metody rozszerzenia łańcucha Coalesce. Ponieważ ci tutaj używają LINQ i absolutnie marnują zasoby na czasochłonne operacje (używam go w ciasnych pętlach), udostępnię moje:
Myślę, że jest to dość proste i nie musisz nawet przejmować się pustymi wartościami łańcuchowymi. Użyj tego w ten sposób:
Często go używam. Jedna z tych "narzędziowych" funkcji, bez której nie możesz żyć po pierwszym użyciu :-)
źródło
s2.Coalesce(s3)
jest uruchamiany nawet wtedy, gdy nie jest potrzebny. Lepiej jest użyćNullIfEmpty()
rozszerzenia i??
.Podoba mi się zwięzłość poniższej metody rozszerzenia
QQQ
, chociaż oczywiście operator lubi? byłoby lepiej. Ale możemy to zwiększyć, pozwalając na porównanie nie tylko dwóch, ale trzech łańcuchowych wartości opcji, z którymi od czasu do czasu trzeba sobie poradzić (patrz druga funkcja poniżej).źródło
Or
, a ja użyłbymparams
słowa kluczowego, podobnie jak innych odpowiedzi, co pozwala uniknąć powielania definicji dla wielu parametrów.params
przypadku włączenia byłoby lepiej nie robić tego w przypadku domyślnego scenariusza lub dwóch, ponieważparams
powoduje to niepotrzebne przydzielanie tablicy, gdy masz tylko jedno lub dwa domyślne dane wejściowe. Po tym ma sens.