Default untuk KeyValuePair


392

Saya memiliki objek dari tipe yang IEnumerable<KeyValuePair<T,U>> keyValueListsaya gunakan

 var getResult= keyValueList.SingleOrDefault();
 if(getResult==/*default */)
 {
 }
 else
 {
 } 

Bagaimana saya bisa mengecek getResult default, kalau-kalau saya tidak dapat menemukan elemen yang benar?

Saya tidak dapat memeriksa apakah itu benar nullatau tidak, karena KeyValuePairini adalah struct.


1
Berikut adalah pertanyaan serupa dengan beberapa jawaban menarik: stackoverflow.com/q/793897/323071
Andre Luus

2
Anda juga dapat mengatakan getResult.Key! = Null untuk memeriksa apakah daftar itu nol seolah-olah kuncinya akan selalu nol
pengibot

3
@pengibot Itu mengasumsikan Kunci tidak dapat dibatalkan.
Justin Skiles

Jawaban:


542

Coba ini:

if (getResult.Equals(new KeyValuePair<T,U>()))

atau ini:

if (getResult.Equals(default(KeyValuePair<T,U>)))

5
Anda dapat menggunakan konsep opsi "baru" di sini, tetapi hindari keharusan menentukan kembali tipe: if (getResult.Equals (Activator.CreateInstance (getResult.GetType ())))
kevinpo

3
saya pikir if (getResult.Equals(default))juga berfungsi
Simon

2
@Simon tidak tidak. defaultsama dengan nol. Dan default(KeyValuePair<T,U>)adalah KeyValuePair aktual yang berisi null, null. Mengalami ini sendiri.
Yokovaski

100

Anda dapat membuat metode ekstensi umum (dan generik), seperti ini:

public static class Extensions
{
    public static bool IsDefault<T>(this T value) where T : struct
    {
        bool isDefault = value.Equals(default(T));

        return isDefault;
    }
}

Pemakaian:

// We have to set explicit default value '0' to avoid build error:
// Use of unassigned local variable 'intValue'
int intValue = 0;
long longValue = 12;
KeyValuePair<String, int> kvp1 = new KeyValuePair<String, int>("string", 11);
KeyValuePair<String, int> kvp2 = new KeyValuePair<String, int>();
List<KeyValuePair<String, int>> kvps = new List<KeyValuePair<String, int>> { kvp1, kvp2 };
KeyValuePair<String, int> kvp3 = kvps.FirstOrDefault(kvp => kvp.Value == 11);
KeyValuePair<String, int> kvp4 = kvps.FirstOrDefault(kvp => kvp.Value == 15);

Console.WriteLine(intValue.IsDefault()); // results 'True'
Console.WriteLine(longValue.IsDefault()); // results 'False'
Console.WriteLine(kvp1.IsDefault()); // results 'False'
Console.WriteLine(kvp2.IsDefault()); // results 'True'
Console.WriteLine(kvp3.IsDefault()); // results 'False'
Console.WriteLine(kvp4.IsDefault()); // results 'True'

27

Coba ini:

KeyValuePair<string,int> current = this.recent.SingleOrDefault(r => r.Key.Equals(dialog.FileName) == true);

if (current.Key == null)
    this.recent.Add(new KeyValuePair<string,int>(dialog.FileName,0));

3
Tentu saja, itu hanya berfungsi jika Anda tidak akan (secara tidak sengaja atau sengaja) menambahkan null sebagai kunci. Tapi saya akan mengatakan itu benar sebagian besar waktu, ide yang sangat bagus. Itu jelas merupakan cara pemeriksaan yang lebih sederhana daripada sebagian besar pemeriksaan di sini.
neminem

3
Selama kuncinya adalah nullable.
Uri Abramson

10
if(getResult.Key.Equals(default(T)) && getResult.Value.Equals(default(U)))

Satu-satunya hal yang tidak dikompilasi. Persamaan harus digunakan sebagai gantinya.
Tamas Ionut

8

Saya merekomendasikan cara yang lebih memahami menggunakan metode ekstensi:

public static class KeyValuePairExtensions
{
    public static bool IsNull<T, TU>(this KeyValuePair<T, TU> pair)
    {
        return pair.Equals(new KeyValuePair<T, TU>());
    }
}

Dan kemudian gunakan:

var countries = new Dictionary<string, string>
{
    {"cz", "prague"},
    {"de", "berlin"}
};

var country = countries.FirstOrDefault(x => x.Key == "en");

if(country.IsNull()){

}

7

Dari kode asli Anda, sepertinya yang Anda inginkan adalah memeriksa apakah daftar itu kosong:

var getResult= keyValueList.SingleOrDefault();
if (keyValueList.Count == 0)
{
   /* default */
}
else
{
}

Anda bisa menghilangkan baris pertama, karena tidak digunakan.
HeyJude

0

Untuk menghindari tinju KeyValuePair.Equals(object)Anda bisa menggunakan a ValueTuple.

if ((getResult.Key, getResult.Value) == default)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.