LINQ FirstOrDefault检查默认值

Raj*_*mar 35 c# linq

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

例如:

Contact contact = dbo.contact
                     .Where(m => m.contactName == "Stackoverflow")
                     .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

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

if (!contact.contactName.Equals("Stackoverflow"))
    // do something
Run Code Online (Sandbox Code Playgroud)

key*_*rdP 51

您不需要执行等于检查,因为您的查询只返回contantName所在的对象Stackoverflow.当你使用FirstOrDefault它时,null如果没有找到任何对象则返回,这样你就可以做到

if(contact == null)
    do something
Run Code Online (Sandbox Code Playgroud)

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

if(contact == default(Contact))
    do something
Run Code Online (Sandbox Code Playgroud)

正如评论中所提到的,通过使用FirstOrDefault带谓词的重载,您可以使代码更高效.

FirstOrDefault(m => m.contactName == "Stackoverflow") 
Run Code Online (Sandbox Code Playgroud)

如果您的程序需要使用除nullor 之外的其他内容,您还可以更改返回的默认值0.例如

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

Contact contact = dbo.contact.Where(m=>m.contactName == "Stackoverflow")
                             .DefaultIfEmpty(defaultContact).First();
Run Code Online (Sandbox Code Playgroud)

defaultContact如果没有找到其他对象,则上面将返回该对象(而不是返回null).如果你这样做,那么你不需要检查nulldefault(T)因为你知道你有一个Contact对象.

  • 还有一点需要注意 - 最好使用`FirstOrDefault(m => m.contactName =="Stackoverflow") (2认同)

Rys*_*gan 7

FirstOrDefault将返回null引用类型和default值类型.因此,您的测试无效.除了检查值是否为默认值之外,您应该将其与default (Type)以下值进行比较:

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

if (!object.Equals(contact, default (Contact)))
    // Is not default
Run Code Online (Sandbox Code Playgroud)

上面的代码可以使用struct Contactclass Contact.我们还假设它default (Contact)永远不是我们查询的有效返回值.


ven*_*mit 5

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

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

例如,如果它是值类型,int那么它将返回 0。如果是引用类型,它将返回“ Null”等。