سؤال

ولدي كائن من نوع IEnumerable<KeyValuePair<T,U>> keyValueList، أنا باستخدام

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

وكيف يمكنني التحقق مما اذا كانت getResult هو الافتراضي، في حال كنت لا يمكن العثور على العنصر الصحيح؟

وأنا لا يمكن أن تحقق ما إذا كان null أو لا، لأن KeyValuePair هو البنية.

هل كانت مفيدة؟

المحلول

وجرب هذا:

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

وأو هذا:

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

نصائح أخرى

ويمكنك إنشاء عموما (وعامة) طريقة التمديد، مثل هذا واحد:

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'

وجرب هذا:

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));

واعتبارا من C # 7.1، يمكنك استخدام <لأ href = "https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/default-value-expressions# الافتراضي الحرفي ومن نوع الاستدلال "يختلط =" noreferrer "> وdefault الحرفي مع نوع الاستدلال لتبسيط التعبير:

var getResult= keyValueList.SingleOrDefault();

if(getResult.Equals(default))
{
}
else
{
} 
if(getResult.Key.Equals(default(T)) && getResult.Value.Equals(default(U)))

ومن التعليمات البرمجية الأصلية الخاصة بك يبدو ما تريده هو للتحقق مما إذا كانت قائمة فارغة:

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

وأوصي بطريقة أكثر فهم باستخدام طريقة التمديد:

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()){

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top