سؤال
ولدي كائن من نوع 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()){
}