Saya ingin mengurai string menjadi int nullable di C #. yaitu. Saya ingin mendapatkan kembali nilai int string atau null jika tidak dapat diuraikan.
Saya agak berharap ini akan berhasil
int? val = stringVal as int?;
Tetapi itu tidak akan berhasil, jadi cara saya melakukannya sekarang adalah saya telah menulis metode ekstensi ini
public static int? ParseNullableInt(this string value)
{
if (value == null || value.Trim() == string.Empty)
{
return null;
}
else
{
try
{
return int.Parse(value);
}
catch
{
return null;
}
}
}
Apakah ada cara yang lebih baik untuk melakukan ini?
EDIT: Terima kasih atas saran TryParse, saya memang tahu tentang itu, tetapi ternyata sama. Saya lebih tertarik mengetahui apakah ada metode kerangka kerja bawaan yang akan menguraikan secara langsung ke int nullable?
Jawaban:
int.TryParse
mungkin sedikit lebih mudah:Edit @Glenn
int.TryParse
adalah "dibangun ke dalam kerangka kerja". Danint.Parse
yang satu cara untuk mengurai string ke int.sumber
Anda dapat melakukan ini dalam satu baris, menggunakan operator kondisional dan fakta bahwa Anda dapat menggunakan
null
tipe nullable (dua baris, jika Anda tidak memiliki int yang sudah ada, Anda dapat menggunakan kembali untuk output dariTryParse
):Pra C # 7:
Dengan sintaks diperbarui C # 7 yang memungkinkan Anda untuk mendeklarasikan variabel output dalam pemanggilan metode, ini menjadi lebih sederhana.
sumber
int.TryParse(val, out i) ? i : default(int?);
[ Diperbarui untuk menggunakan C # modern sesuai saran @ sblom]
Saya punya masalah ini dan saya berakhir dengan ini (setelah semua, an
if
dan 2return
s sangat bertele-tele!):Pada catatan yang lebih serius, cobalah untuk tidak mencampur
int
, yang merupakan kata kunci C #, denganInt32
, yang merupakan tipe .NET Framework BCL - meskipun berfungsi, itu hanya membuat kode terlihat berantakan.sumber
int i;
baris dan langsung sajareturn int.TryParse (val, out var i) ? (int?) i : null;
int? ParseNInt (string val) => int.TryParse (val, out var i) ? (int?) i : null;
Ada pendekatan ini yang akan menguraikan secara langsung ke int nullable (dan bukan hanya int) jika nilainya valid seperti null atau string kosong, tetapi tidak membuang pengecualian untuk nilai yang tidak valid sehingga Anda harus menangkap pengecualian dan mengembalikan nilai default untuk situasi tersebut:
Pendekatan ini masih dapat digunakan untuk parse yang tidak dapat dibatalkan maupun nullable:
NB: Ada metode IsValid pada konverter yang dapat Anda gunakan alih-alih menangkap pengecualian (pengecualian yang dilemparkan tidak menghasilkan overhead yang tidak perlu jika diharapkan). Sayangnya itu hanya bekerja sejak .NET 4 tetapi masih ada masalah di mana ia tidak memeriksa lokal Anda ketika memvalidasi format DateTime yang benar, lihat bug 93559 .
sumber
Sumber:
sumber
Topik lama, tapi bagaimana dengan:
Saya suka ini lebih baik sebagai persyaratan tempat parse null, versi TryParse tidak akan melempar kesalahan pada misalnya ToNullableInt32 (XXX). Itu dapat menyebabkan kesalahan diam yang tidak diinginkan.
sumber
int
, itu harus kembalinull
, bukan melemparkan pengecualian.Coba ini:
sumber
Saya merasa solusi saya adalah solusi yang sangat bersih dan menyenangkan:
Ini tentu saja merupakan solusi generik yang hanya mengharuskan argumen generik memiliki metode statis "Parse (string)". Ini berfungsi untuk angka, boolean, DateTime, dll.
sumber
Anda dapat melupakan semua jawaban lain - ada solusi umum yang hebat: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Ini memungkinkan Anda untuk menulis kode yang sangat bersih seperti ini:
dan juga:
sumber
Yang berikut ini harus bekerja untuk semua tipe struct. Ini didasarkan dari kode oleh Matt Manela dari forum MSDN . Seperti Murph tunjukkan penanganan pengecualian bisa mahal dibandingkan dengan menggunakan metode TryParse Jenis khusus.
Ini adalah kasus uji dasar yang saya gunakan.
sumber
Saya akan menyarankan metode ekstensi berikut untuk string parsing ke nilai int dengan kemampuan untuk menentukan nilai default jika parsing tidak mungkin:
sumber
Solusi ini generik tanpa overhead refleksi.
sumber
IsNullOrEmpty
denganIsNullOrWhitespace
Tidak ada.
sumber
Saya merasa saya harus membagikan milik saya yang sedikit lebih umum.
Pemakaian:
Larutan:
Versi pertama lebih lambat karena membutuhkan coba-coba tetapi terlihat lebih bersih. Jika tidak akan dipanggil berkali-kali dengan string yang tidak valid, itu tidak penting. Jika kinerja merupakan masalah, harap perhatikan bahwa saat menggunakan metode TryParse, Anda perlu menentukan parameter tipe ParseBy karena tidak dapat disimpulkan oleh kompiler. Saya juga harus mendefinisikan delegasi sebagai kata kunci keluar tidak dapat digunakan dalam Fungsi <>, tetapi setidaknya kali ini kompiler tidak memerlukan contoh eksplisit.
Akhirnya, Anda dapat menggunakannya dengan struct lain juga, yaitu desimal, DateTime, Guid, dll.
sumber
Saya menemukan dan mengadaptasi beberapa kode untuk kelas Generic NullableParser. Kode lengkapnya ada di blog saya Nullable TryParse
sumber
sumber
Anda seharusnya tidak pernah menggunakan pengecualian jika Anda tidak perlu - overhead itu mengerikan.
Variasi pada TryParse menyelesaikan masalah - jika Anda ingin menjadi kreatif (untuk membuat kode Anda terlihat lebih elegan) Anda mungkin bisa melakukan sesuatu dengan metode ekstensi dalam 3,5 tetapi kode akan kurang lebih sama.
sumber
Menggunakan delegasi, kode berikut ini dapat memberikan reusability jika Anda membutuhkan parsing nullable untuk lebih dari satu tipe struktur. Saya telah menunjukkan versi .Parse () dan .TryParse () di sini.
Ini adalah contoh penggunaan:
Dan di sini adalah kode yang membuat Anda di sana ...
sumber
Saya menyadari ini adalah topik lama, tetapi tidak bisakah Anda hanya:
?
sumber
Saya telah datang dengan yang ini, yang telah memenuhi persyaratan saya (saya ingin metode ekstensi saya untuk meniru sedekat mungkin kembalinya TryParse kerangka kerja, tetapi tanpa blok mencoba {} catch {} dan tanpa kompiler mengeluh tentang menyimpulkan sebuah jenis nullable dalam metode kerangka kerja)
sumber
Saya sarankan kode di bawah ini. Anda dapat bekerja dengan pengecualian, saat kesalahan konversi terjadi.
Gunakan metode ekstensi ini dalam kode (isi properti? Umur dari kelas orang):
ATAU
sumber