KeyValuePair के लिए डिफ़ॉल्ट


392

मेरे पास प्रकार की एक वस्तु है IEnumerable<KeyValuePair<T,U>> keyValueList, मैं उपयोग कर रहा हूं

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

getResultयदि मैं सही तत्व नहीं खोज पा रहा हूं तो मैं कैसे जांच सकता हूं कि क्या डिफ़ॉल्ट है?

मैं यह नहीं देख सकता कि यह एक संरचना है nullया नहीं KeyValuePair


1
यहाँ कुछ दिलचस्प जवाब के साथ इसी तरह का सवाल है: stackoverflow.com/q/793897/323071
आंद्रे लुस

2
आप यह भी कह सकते हैं कि getResult.Key! = यह जांचने के लिए अशक्त है कि क्या सूची अशक्त है जैसे कि यह कुंजी हमेशा अशक्त होगी
पेंगिबॉट

3
@pengibot जो मानता है कि कुंजी अशक्त है।
जस्टिन स्काइल्स

जवाबों:


542

इसे इस्तेमाल करे:

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

या यह:

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

5
आप यहां "नए" विकल्प की अवधारणा का उपयोग कर सकते हैं, लेकिन प्रकार को फिर से निर्दिष्ट करने से बचें: यदि (getResult.Equals (Activator.CreateInstance (getResult.GetType ())))
kevinpo

3
मुझे लगता है कि if (getResult.Equals(default))यह भी काम करता है
साइमन

2
@ साइमन नहीं यह नहीं है। defaultअशक्त के बराबर। और default(KeyValuePair<T,U>)एक वास्तविक KeyValuePair है जिसमें शामिल है null, null। इसका अनुभव स्वयं किया।
योकोवस्की

100

आप इस तरह से एक सामान्य (और सामान्य) विस्तार विधि बना सकते हैं:

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

        return isDefault;
    }
}

उपयोग:

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

इसे इस्तेमाल करे:

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
बेशक, यह केवल तभी काम करता है जब आप कभी नहीं जा रहे हैं (गलती से या उद्देश्यपूर्ण रूप से) एक कुंजी के रूप में शून्य जोड़ें। लेकिन मैं कहूंगा कि यह समय का सबसे बड़ा सच है, इसलिए अच्छा विचार है। यह निश्चित रूप से यहाँ की अधिकांश जाँचों की तुलना में एक सरल तरीका है।
निनीम

3
जब तक कुंजी अशक्त है।
उरी अब्रामसन

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

केवल एक चीज यह है कि संकलन नहीं है। इसकी जगह बराबरी का इस्तेमाल करना चाहिए।
तमस इयोनुत

8

मैं विस्तार विधि का उपयोग करते हुए अधिक समझने की सलाह देता हूं:

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

और फिर बस उपयोग करें:

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

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

if(country.IsNull()){

}

7

आपके मूल कोड से ऐसा लगता है कि आप चाहते हैं कि सूची खाली है या नहीं

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

आप केवल पहली पंक्ति को छोड़ सकते हैं, क्योंकि इसका उपयोग नहीं किया जाता है।
हेयूड

0

KeyValuePair.Equals(object)आप की मुक्केबाजी से बचने के लिए एक का उपयोग कर सकते हैं ValueTuple

if ((getResult.Key, getResult.Value) == default)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.