Berikut adalah versi sederhana dari apa yang saya coba lakukan:
var days = new Dictionary<int, string>();
days.Add(1, "Monday");
days.Add(2, "Tuesday");
...
days.Add(7, "Sunday");
var sampleText = "My favorite day of the week is 'xyz'";
var day = days.FirstOrDefault(x => sampleText.Contains(x.Value));
Karena 'xyz' tidak ada dalam kamus, metode FirstOrDefault tidak akan mengembalikan nilai yang valid. Saya ingin dapat memeriksa situasi ini tetapi saya menyadari bahwa saya tidak dapat membandingkan hasilnya dengan "null" karena KeyValuePair adalah sebuah struc. Kode berikut tidak valid:
if (day == null) {
System.Diagnotics.Debug.Write("Couldn't find day of week");
}
Kami Anda mencoba untuk mengkompilasi kode, Visual Studio membuat kesalahan berikut ini:
Operator '==' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<int,string>' and '<null>'
Bagaimana saya dapat memeriksa bahwa FirstOrDefault telah mengembalikan nilai yang valid?
Jawaban:
FirstOrDefault
tidak mengembalikan nol, ia mengembalikandefault(T)
.Anda harus memeriksa:
var defaultDay = default(KeyValuePair<int, string>); bool b = day.Equals(defaultDay);
Dari MSDN -
Enumerable.FirstOrDefault<TSource>
:Catatan:
EqualityComparer<T>.Default.Equals(day, defaultDay)
, karena.Equals
mungkin diganti atauday
bisa jadinull
.KeyValuePair<int, string> defaultDay = default;
, lihat literal "default" yang diketik target .FirstOrDefault
sumber
typeof
? Kode ini mengkompilasi dan berfungsi.default(KeyValuePair<T1, T2>)
akan terjadi. Ok, seharusnya sudah cukup jelas, bahwa itu akan menghasilkan KVP kosong. Tetapi karena "menjadi jelas" bukanlah pendekatan yang baik untuk menulis aplikasi yang tepat (dan implementasi saya saat ini terlalu rumit untuk memprovokasi kasus ini dengan jelas / rapi), saya mencobanya dengan proyek baru dan - memang - itu mengembalikan aKeyValuePair
with propertiesKey
andValue
being keduanyaNULL
.... hanya untuk menyelamatkan beberapa orang lain 5 menit kebodohan ini ;-)default
kata kunci, jelas hilang di sini. Terima kasih!KeyValuePair
. Jika Anda memiliki kode generik,day.Equals
bahkan tidak aman dari nol, dan saya akan menggunakanEqualityComparer<T>.Default.Equals(day, defaultDay)
Ini cara yang paling jelas dan ringkas menurut saya:
var matchedDays = days.Where(x => sampleText.Contains(x.Value)); if (!matchedDays.Any()) { // Nothing matched } else { // Get the first match var day = matchedDays.First(); }
Ini benar-benar berkeliling menggunakan barang nilai default yang aneh untuk struct.
sumber
days
adalah aDictionary<int,string>
. Jadi itu akan dianggap sebagaiIEnumerable<KeyValuePair<int,string>>
, kemudian berperilaku seperti yang diharapkan ketikaAny()
danFirst()
dipanggil. Saya rasa ada implementasi lain yang dapat berperilaku berbeda sepertiIEnumerable<>
. Saya tidak tahu apakah saya melewatkan sesuatu.Anda dapat melakukan ini sebagai gantinya:
var days = new Dictionary<int?, string>(); // replace int by int? days.Add(1, "Monday"); days.Add(2, "Tuesday"); ... days.Add(7, "Sunday"); var sampleText = "My favorite day of the week is 'xyz'"; var day = days.FirstOrDefault(x => sampleText.Contains(x.Value));
lalu :
if (day.Key == null) { System.Diagnotics.Debug.Write("Couldn't find day of week"); }
sumber