FirstOrDefault与null的比较

时间:2015-10-28 21:46:50

标签: c# null compare

你可以解释一下,当第一个表达式已经返回true或者false时它是如何返回true或false的?我的意思是为什么它仍然需要与!= null

进行比较
public static bool IsLanguageAvaliable(string lang)
    {
        return AvaliableLanguages.FirstOrDefault(languages => languages.LangCultureName.Equals(lang)) != null;
    }

4 个答案:

答案 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,断言不正确。

FirstOrDefault()

  

返回序列的第一个元素,如果序列不包含元素,则返回默认值。

  

我的意思是为什么它仍然需要与!= 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