如何检查FirstOrDefault
LINQ函数返回的对象是否实际上是默认值?
例如:
Contact contact = dbo.contact
.Where(m => m.contactName == "Stackoverflow")
.FirstOrDefault();
是否有其他方法可以检查上述联系人是否为默认值而不是使用以下内容?
if (!contact.contactName.Equals("Stackoverflow"))
// do something
答案 0 :(得分:50)
您不需要执行等于检查,因为您的查询只返回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();
如果没有找到其他对象(而不是返回null),上面将返回defaultContact
对象。如果您这样做,则无需检查null
或default(T)
,因为您知道自己有Contact
个对象。
答案 1 :(得分:7)
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)
永远不是我们查询的有效返回值。
答案 2 :(得分:4)
FirstOrDefault()代表第一个元素,如果没有找到,那么该类型的“默认”值。它在内部使用default
关键字返回默认值。
用法:return default(Contact) or default(int)
例如如果它是一个值类型,请说int
然后它将返回0.如果是引用类型,它将返回“Null
”等。
答案 3 :(得分:1)
您可以使用
Contact contact = dbo.contact.where(m=>m.contactName!="" &&m.contactName!=null && m.contactName == "Stackoverflow").FirstOrDefault();
答案 4 :(得分:1)
通常,FirstOrDefault
会返回您为集合类型请求default
值的项目。
如果引用它是null
,如果是int - 0
等等。