Sesuatu yang saya temukan semakin sering dilakukan adalah memeriksa string untuk kosong (seperti dalam ""
atau nol) dan operator bersyarat.
Contoh saat ini:
s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
Ini hanya metode ekstensi, itu setara dengan:
string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
Karena ini kosong dan bukan nol, ??
tidak akan melakukan trik. Sebuah string.IsNullOrEmpty()
versi ??
akan menjadi solusi sempurna. Saya pikir harus ada cara yang lebih bersih untuk melakukan ini (saya harap!), Tetapi saya bingung untuk menemukannya.
Adakah yang tahu cara yang lebih baik untuk melakukan ini, bahkan jika itu hanya di. Net 4.0?
c#
string
coalesce
null-coalescing-operator
Nick Craver
sumber
sumber
let (|?) x y = if String.IsNullOrEmpty(x) then y else x
dan menggunakannya sepertis.SiteNumber |? "No Number"
.Jawaban:
Tidak ada cara bawaan untuk melakukan ini. Anda dapat membuat metode ekstensi Anda mengembalikan string atau null, yang akan memungkinkan operator penggabungan untuk bekerja. Namun, ini akan aneh, dan saya pribadi lebih suka pendekatan Anda saat ini.
Karena Anda sudah menggunakan metode ekstensi, mengapa tidak membuatnya saja yang mengembalikan nilai atau default:
sumber
???
operator di C # 5, siapa tahu.item ?? x=> x.ToString() : null;
C # sudah memungkinkan kita mengganti nilai
null
dengan??
. Jadi yang kita butuhkan adalah ekstensi yang mengubah string kosong menjadinull
, dan kemudian kita menggunakannya seperti ini:Kelas ekstensi:
sumber
Saya tahu ini adalah pertanyaan lama - tetapi saya sedang mencari jawaban dan tidak ada yang sesuai dengan kebutuhan saya dan juga apa yang akhirnya saya gunakan:
Pemakaian:
EDIT: Cara penulisan fungsi ini yang lebih ringkas adalah:
sumber
using System.Linq
Saya memiliki beberapa ekstensi utilitas yang ingin saya gunakan:
Sunting: Terinspirasi oleh jawaban sfsr , saya akan menambahkan varian ini ke kotak alat saya mulai sekarang:
sumber
@
awalan pada@default
parameter? Saya belum pernah melihat itu sebelumnya.default
sebagai nama variabel meskipun kata kunci tersebut disimpan dalam C #.Metode ekstensi yang sedikit lebih cepat daripada yang diusulkan sebelumnya mungkin:
sumber
code
public static string Coalesce (string ini @ini, string @default = "") {return (@ini == null || String.IsNullOrWhiteSpace (@ini))? @ kesalahan: @ ini; }Salah satu keuntungan dari operator null-coalescing adalah hubung singkat. Ketika bagian pertama bukan nol, bagian kedua tidak dievaluasi. Ini bisa bermanfaat ketika fallback membutuhkan operasi yang mahal.
Saya berakhir dengan:
Pemakaian:
sumber
Saya hanya menggunakan metode ekstensi NullIfEmpty yang akan selalu mengembalikan nol jika string kosong memungkinkan ?? (Null Coalescing Operator) untuk digunakan seperti biasa.
Ini kemudian memungkinkan ?? untuk digunakan seperti biasa dan membuat rantai mudah dibaca.
sumber
bagaimana dengan metode ekstensi string ValueOrDefault ()
atau mengembalikan null jika string kosong:
Namun tidak mencoba solusi ini.
sumber
...OrDefault()
akan membingungkan jika tidak berperilaku seperti...OrDefault()
metode kerangka lainnya . Suka atau tidak suka, MS telah memberi arti khusus pada penamaan itu dan menyimpang dari perilaku itu dalam metode khusus tidak perlu membingungkan bagi pengguna API Anda.Saya menggunakan metode ekstensi string Coalesce saya sendiri. Karena yang ada di sini menggunakan LINQ, dan membuang-buang sumber daya absolutelly untuk operasi intensif waktu (saya menggunakannya dalam putaran yang ketat), saya akan membagikan milik saya:
Saya pikir ini cukup sederhana, dan Anda bahkan tidak perlu repot dengan nilai string nol. Gunakan seperti ini:
Saya sering menggunakannya. Salah satu fungsi "utilitas" yang Anda tidak dapat hidup tanpanya setelah pertama kali menggunakannya :-)
sumber
s2.Coalesce(s3)
dijalankan bahkan ketika tidak diperlukan juga. Lebih baik menggunakanNullIfEmpty()
ekstensi dan??
.Saya suka keringkasan metode ekstensi berikut
QQQ
untuk ini, meskipun tentu saja operator suka? akan lebih baik. Tetapi kita dapat memperbaikinya dengan memperbolehkan tidak hanya dua tetapi tiga nilai opsi string untuk dibandingkan, yang kita temui harus ditangani sesekali (lihat fungsi kedua di bawah).sumber
Or
, dan saya akan menggunakanparams
kata kunci, seperti jawaban lainnya, yang menghindari definisi ganda untuk beberapa parameter.params
, akan lebih baik untuk tidak melakukannya untuk skenario default atau dua, karenaparams
menyebabkan array tidak perlu dialokasikan ketika Anda hanya memiliki satu atau dua input default. Setelah itu masuk akal.