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
您不需要执行等于检查的操作,因为您的查询仅返回 contantName Stackoverflow
的对象。当您使用FirstOrDefault
时,如果未找到对象,它会返回null
,以便您可以执行
if(contact == null)
do something
如果 Contact 是一个类,则您知道它是一个引用类型,因此它的默认值将为 null。但是,您可以使用 default
检查它是任何对象(引用或值(的默认类型。
if(contact == default(Contact))
do something
如注释中所述,您可以通过使用采用谓词的重载来提高代码的效率FirstOrDefault
。
FirstOrDefault(m => m.contactName == "Stackoverflow")
如果您的程序需要使用 null
或 0
以外的其他内容,您还可以更改返回的默认值。例如
Contact defaultContact = new Contact();
defaultContact.ContactName = "StackExchange";
Contact contact = dbo.contact.Where(m=>m.contactName == "Stackoverflow")
.DefaultIfEmpty(defaultContact).First();
如果未找到其他对象,则上述将返回defaultContact
对象(而不是返回 null(。如果这样做,则无需检查null
或default(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 Contact
或class 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
等的情况下。