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.

Graviton
sumber
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>)))
Andrew Hare
sumber
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'
pholpar
sumber
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));
Peter
sumber
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)))
Kekacauan Kekacauan
sumber
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()){

}
Miroslav Holec
sumber
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
{
}
Stephen Westlake - Infusion
sumber
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)
Jonas Nyrup
sumber