I metodi LINQ *OrDefault (FirstOrDefault o SingleOrDefault solo per citarne alcuni) prevedono che se la query non restituisca un elemento, allora venga restituito il valore di default del tipo del'elemento. Per fare un esempio, se cerchiamo un elemento in una lista di classi e l'oggetto non viene trovato, il valore restituito da qualunque di questi metodi è null. Se invece cerchiamo in una lista di numeri e non troviamo il dato cercato, il valore restituito è 0.
Quest'impostazione va bene in molti casi, ma non in tutti. Supponiamo di avere una lista di numeri [30, 55, 11] e di voler trovare il primo minore di 10. La query dovrebbe essere scritta nel seguente modo.
var numbers = new [] { 30, 55, 11 }; var number = numbers.FirstOrDefault(c => c < 10);
In questo caso non viene trovato nessun numero, ma poichè il valore di default del tipo Int32 è 0, la variabile number sarà valorizzata a 0 dando l'impressione che ci sia un numero minore di 10. Un approccio alla soluzione potrebbe essere l'utilizzo dei metodi Count o Any per verificare che esista un numero prima di effetturare la query.
var numbers = new [] { 30, 55, 11 }; if (numbers.Any(c => c < 10)) { var number = numbers.FirstOrDefault(c => c < 10); ... } else { ... }
Con questo approccio il codice aumenta notevolmente. Possiamo invece ridurlo usando un overload dei metodi *OrDefault che ci permette di specificare il valore di default da restituire al posto del default del tipo. Nel nostro esempio, se sappiamo che nella lista ci spossono essere solo numeri positivi, possiamo usare il valore -1 come default.
var numbers = new [] { 30, 55, 11 }; var number = numbers.FirstOrDefault(c => c < 10, -1); if (number == -1) { ... } else { ... }
In questo modo il codice è più efficiente (si risparmia una query LINQ), più breve e più leggibile.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Generare file PDF da Blazor WebAssembly con iText
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
Assegnare un valore di default a un parametro di una lambda in C#
Utilizzare database e servizi con gli add-on di Container App
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Eseguire operazioni con timeout in React
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Recuperare un elemento inserito nella cache del browser tramite API JavaScript
Effettuare chiamate con versioning da Blazor ad ASP.NET Core
Eseguire operazioni sui blob con Azure Storage Actions
I più letti di oggi
- Miglioramenti nelle performance di Angular 16
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- HTML5 con CSS e JavaScript
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzazione dei block template in Angular 17
- Disabilitare automaticamente un workflow di GitHub (parte 2)