2013-08-12 13 views
28

come posso verificare se l'oggetto restituito dalla funzione linq di FirstorDefault è di fatto predefinito?linq Firstordefault verifica il valore predefinito

Per esempio

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

c'è un modo alternativo per verificare se il contatto di cui sopra è il valore di default invece di utilizzare:

if(!contact.contactName.equal("Stackoverflow")) 
      do something 

risposta

44

Non sarebbe necessario eseguire che è uguale controllo perché la vostra query restituisce solo oggetti in cui contantName è Stackoverflow. Quando si utilizza FirstOrDefault restituisce null se non sono stati trovati oggetti in modo da poter fare

if(contact == null) 
    do something 

Sai che è un tipo di riferimento se il contatto è una classe così il suo valore di default sarebbe nullo. Tuttavia, è possibile controllare che sia il tipo predefinito di qualsiasi oggetto (riferimento o valore) utilizzando default.

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

Come accennato nei commenti, si può eventualmente rendere il codice più efficiente, utilizzando il sovraccarico di FirstOrDefault che prende un predicato.

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

È inoltre possibile modificare il valore predefinito restituito se il programma ha bisogno di lavorare con qualcosa di diverso da un null o 0. Ad esempio

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

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

Quanto sopra restituire l'oggetto defaultContact se nessun altro oggetto è stato trovato (invece di null ritorno). Se si esegue questa operazione, non è necessario controllare null o default(T) perché si sa che si dispone di un oggetto Contact.

+1

Una nota di più - è meglio usare 'FirstOrDefault (m => m.contactName == "StackOverflow")' –

+1

+1, ha aggiunto di rispondere :) – keyboardP

+1

Funziona solo se 'contact' è un tipo di riferimento, usando' default() 'è migliore. –

7

FirstOrDefault restituirà null per i tipi di riferimento e default per i tipi di valore. Quindi il tuo test non è valido. In orther per controllare wheteher il valore è di default, si dovrebbe confrontare con default (Type):

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

if (!object.Equals(contact, default (Contact))) 
    // Is not default 

Il codice qui sopra funziona sia con struct Contact o class Contact. Supponiamo inoltre che default (Contact) non sia mai un valore di ritorno valido della nostra query.

+0

Dovresti fornire qualche codice di esempio, questo sarebbe il miglior controllo. –

1

È possibile utilizzare

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

FirstOrDefault() sta per primo elemento, se non lo trova, allora il valore "Default" di quel tipo. Utilizza internamente la parola chiave default per restituire il valore predefinito.

Utilizzo: return default(Contact) or default(int)

per esempio se si tratta di un tipo di valore diciamo int allora tornerà 0. In caso di tipi di riferimento che tornerà "Null", ecc

Spero che questo senso per te.

1

Generalmente, FirstOrDefault restituisce l'articolo che hai richiesto del valore default per tipo di raccolta. In caso di riferimenti è null, in caso di int - 0 ecc

Problemi correlati