具有null的FirstOrDefault比较

本文关键字:比较 FirstOrDefault null 具有 | 更新日期: 2023-09-27 18:19:37

你能解释一下,当第一个表达式已经返回true或false时,它是如何返回true或false的吗?我的意思是为什么它还需要与比较=空

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

具有null的FirstOrDefault比较

如果表达式在集合中找不到任何匹配项,则

FirstOrDefault将返回类型的默认值。换句话说,如果没有languages.LangCultureName等于lang的值,那么您将从FirstOrDefault返回一个null

虽然表达式languages.LangCultureName.Equals(lang)确实返回true或false,但该值用于从集合中选择对象,而不是方法的返回值。

如果您要做的只是确定lang是否存在,那么您应该使用.Any而不是.FirstOrDefault

当第一个表达式已经返回true或false时,它如何返回true或false?

第一个表达式没有返回true或false,您的断言不正确。

FirstOrDefault()

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

我的意思是为什么它还需要与比较=空

由于您的第一个假设是不正确的,并且根据文档,它返回默认值,并且从对象派生的类的默认值是null。在null上检查相等意味着序列中不存在对象。

您最好使用"Any",如果列表中的任何元素符合您的条件,它将返回true。

public static bool IsLanguageAvaliable(string lang)
{
    return AvaliableLanguages.Any(languages => languages.LangCultureName.Equals(lang));
}

如果您查看FirstOrDefualt方法的签名,它是IEnumerable<T>:上的扩展方法

FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

正如您所看到的,第二个参数的类型是Func,它接受类型为T的对象并返回boolean。使用这个Func参数,可以定义应该选择哪些元素。因此,FirstOrDefault方法迭代您的列表,并使用Func方法来评估哪个对象符合条件。因此,如果FirstOrDefaultIEnumerable<T>列表中找到元素,它将返回一个类型为T的对象,否则结果将是null