LINQ 优先或默认检查默认值

本文关键字:检查 默认值 默认 LINQ | 更新日期: 2023-09-27 18:27:15

如何

检查FirstOrDefault LINQ 函数返回的对象是否实际上是默认值?

例如:

Contact contact = dbo.contact
                     .Where(m => m.contactName == "Stackoverflow")
                     .FirstOrDefault();

有没有其他方法来检查上面的联系人是否是默认值而不是使用以下值?

if (!contact.contactName.Equals("Stackoverflow"))
    // do something

LINQ 优先或默认检查默认值

您不需要执行等于检查的操作,因为您的查询仅返回 contantName Stackoverflow的对象。当您使用FirstOrDefault时,如果未找到对象,它会返回null,以便您可以执行

if(contact == null)
    do something

如果 Contact 是一个类,则您知道它是一个引用类型,因此它的默认值将为 null。但是,您可以使用 default 检查它是任何对象(引用或值(的默认类型。

if(contact == default(Contact))
    do something

如注释中所述,您可以通过使用采用谓词的重载来提高代码的效率FirstOrDefault

FirstOrDefault(m => m.contactName == "Stackoverflow") 

如果您的程序需要使用 null0 以外的其他内容,您还可以更改返回的默认值。例如

Contact defaultContact = new Contact();
defaultContact.ContactName = "StackExchange";
Contact contact = dbo.contact.Where(m=>m.contactName == "Stackoverflow")
                             .DefaultIfEmpty(defaultContact).First();

如果未找到其他对象,则上述将返回defaultContact对象(而不是返回 null(。如果这样做,则无需检查nulldefault(T),因为您知道自己有一个Contact对象。

FirstOrDefault将返回引用类型的null和值类型的default。因此,您的测试无效。或者要检查该值是否为默认值,您应该将其与default (Type)进行比较:

Contact contact = dbo.contact.FirstOrDefault(m => m.contactName == "Stackoverflow");
if (!object.Equals(contact, default (Contact)))
    // Is not default

上面的代码将适用于struct Contactclass Contact。我们还假设default (Contact)从来都不是查询的有效返回值。

FirstOrDefault(( 代表第一个元素,如果未找到,则为该类型的"默认"值。它在内部使用 default 关键字返回默认值。

用法return default(Contact) or default(int)

例如,如果它是一个值类型,比如说int那么它将返回 0。如果是引用类型,它将返回"Null"等。

您可以使用

Contact contact = dbo.contact.where(m=>m.contactName!="" &&m.contactName!=null && m.contactName == "Stackoverflow").FirstOrDefault();
通常

FirstOrDefault返回您请求的集合类型default值的项目。在引用的情况下,它是null,在int - 0等的情况下。