LINQ FirstOrDefault检查默认值

时间:2013-08-12 09:58:06

标签: c# linq

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

例如:

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

是否有其他方法可以检查上述联系人是否为默认值而不是使用以下内容?

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

5 个答案:

答案 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") 

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

Contact defaultContact = new Contact();
defaultContact.ContactName = "StackExchange";

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

如果没有找到其他对象(而不是返回null),上面将返回defaultContact对象。如果您这样做,则无需检查nulldefault(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 Contactclass 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等等。