Mặc định cho KeyValuePair


392

Tôi có một đối tượng của loại IEnumerable<KeyValuePair<T,U>> keyValueList, tôi đang sử dụng

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

Làm cách nào để kiểm tra xem có phải getResultlà mặc định hay không, trong trường hợp tôi không thể tìm thấy phần tử chính xác?

Tôi không thể kiểm tra xem nó có nullhay không, bởi vì KeyValuePairnó là một cấu trúc.


1
Đây là một câu hỏi tương tự với một số câu trả lời thú vị: stackoverflow.com/q/793897/323071
Andre Luus

2
Bạn cũng có thể nói getResult.Key! = Null để kiểm tra xem danh sách có rỗng không vì nếu đó là khóa sẽ luôn là null
pengibot

3
@pengibot Giả sử Khóa là null.
Justin Skiles

Câu trả lời:


542

Thử cái này:

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

hoặc này:

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

5
Bạn có thể sử dụng khái niệm tùy chọn "mới" tại đây, nhưng tránh phải chỉ định lại loại: if (getResult.Equals (Activator.CreateInstance (getResult.GetType ())))
kevinpo 21/03

3
tôi nghĩ if (getResult.Equals(default))cũng hoạt động
Simon

2
@Simon không có. defaultbằng với null. Và default(KeyValuePair<T,U>)là một KeyValuePair thực tế có chứa null, null. Trải nghiệm điều này bản thân mình.
Yokovaski

100

Bạn có thể tạo một phương thức mở rộng chung (và chung chung), như phương pháp này:

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

        return isDefault;
    }
}

Sử dụng:

// 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

Thử cái này:

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
Tất nhiên, điều đó chỉ hoạt động nếu bạn sẽ không bao giờ (vô tình hoặc cố ý) thêm null làm khóa. Nhưng tôi muốn nói rằng đó là sự thật phần lớn thời gian, ý tưởng rất tốt. Đó chắc chắn là một cách kiểm tra đơn giản hơn so với hầu hết các kiểm tra ở đây.
neminem

3
Miễn là chìa khóa là nullable.
Uri Abramson

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

Điều duy nhất là không biên dịch. Bằng nên được sử dụng thay thế.
Tamas Iovy

8

Tôi khuyên bạn nên hiểu thêm về cách sử dụng phương pháp mở rộng:

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

Và sau đó chỉ cần sử dụng:

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

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

if(country.IsNull()){

}

7

Từ mã ban đầu của bạn, có vẻ như những gì bạn muốn là kiểm tra xem danh sách có trống không:

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

Bạn chỉ có thể bỏ qua dòng đầu tiên, vì nó không được sử dụng.
HeyJude

0

Để tránh quyền anh của KeyValuePair.Equals(object)bạn có thể sử dụng a ValueTuple.

if ((getResult.Key, getResult.Value) == default)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.