你可以解释一下,当第一个表达式已经返回true或者false时它是如何返回true或false的?我的意思是为什么它仍然需要与!= null
进行比较public static bool IsLanguageAvaliable(string lang)
{
return AvaliableLanguages.FirstOrDefault(languages => languages.LangCultureName.Equals(lang)) != null;
}
答案 0 :(得分:4)
FirstOrDefault
将返回该类型的默认值。换句话说,如果languages.LangCultureName
不等于lang
的值,您将从null
返回FirstOrDefault
。
虽然表达式languages.LangCultureName.Equals(lang)
确实返回true或false,但该值用于从集合中选择对象,但它不是方法的返回值。< / p>
如果你要做的就是确定lang
是否存在,你应该使用.Any
而不是.FirstOrDefault
。
答案 1 :(得分:2)
如果第一个表达式已经返回true或者为false,它如何返回true或false?
第一个表达式不返回true或false,断言不正确。
返回序列的第一个元素,如果序列不包含元素,则返回默认值。
到
我的意思是为什么它仍然需要与!= null
进行比较
由于您的第一个假设不正确,并且根据文档它返回default,并且从对象派生的类的默认值为null
,检查null上的相等意味着序列中不存在任何对象。
答案 2 :(得分:1)
你可能最好使用“Any”,如果列表中的任何元素符合你的条件,它将返回true。
public static bool IsLanguageAvaliable(string lang)
{
return AvaliableLanguages.Any(languages => languages.LangCultureName.Equals(lang));
}
答案 3 :(得分:0)
如果您查看FirstOrDefualt
方法的签名,它就IEnumerable<T>
上的extension method:
FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
正如您所看到的,第二个参数是Func类型,它接受类型为T的对象并返回boolean
。使用此Func参数,您可以定义应选择哪些元素。所以FirstOrDefault
方法遍历您的列表并使用您的Func方法来评估哪个对象符合条件。因此,FirstOrDefault
会在IEnumerable<T>
列表中找到元素时返回T类型的对象,否则结果将是null