SingleOrDefault restituisce null, ma cosa succede se voglio assegnare valori per rappresentare l'oggetto che non è stato trovato?SingleOrDefault: come modificare i valori predefiniti?
risposta
Si potrebbe rotolare il proprio.
public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
if (1 != enumerable.Count()) {
return defaultValue;
}
return enumerable.Single();
}
questo può essere un po 'costoso, però, perché il conte() richiede di elaborare l'intera collezione e può essere abbastanza costosa da gestire. Sarebbe meglio a uno chiamare singolo, prendere l'InvalidOperationException o rotolare un metodo IsSingle
public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
using (var e = enumerable.GetEnumerator()) {
return e.MoveNext() && !e.MoveNext();
}
}
public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
if (!enumerable.IsSingle()) {
if(enumerable.IsEmpty()) {
return defaultValue;
}
throw new InvalidOperationException("More than one element");
}
return enumerable.Single();
}
Ciò restituirebbe il valore predefinito se l'enumerable contenesse più oggetti. Non dovrebbe gettare un'eccezione come fa l'implementazione standard? – tvanfosson
@tvanfosson si dovrebbe. Avevo l'impressione che SingleOrDefault restituisse il valore predefinito se c'era qualcosa di diverso da un elemento. Ma apparentemente lo farà solo per nessun elemento. Strano, aggiornerò. – JaredPar
Si potrebbe creare i propri metodi di estensione - SingleOrNew.
public static class IEnumerableExtensions
{
public static T SingleOrNew<T>(this IEnumerable<T> enumeration, T newValue)
{
T elem = enumeration.SingleOrDefault();
if (elem == null)
{
return newValue;
}
return elem;
}
public static T SingleOrNew<T>(this IEnumerable<T> enumeration, Func<T,bool> predicate, T newValue)
{
T elem = enumeration.SingleOrDefault(predicate);
if (elem == null)
{
return newValue;
}
return elem;
}
}
Il problema con questo approccio è che si restituirà il parametro newValue per una raccolta che contiene un singolo elemento con il valore null. Considera questa espressione (nuova stringa [] {null}). SingleOrNew ("pippo") ;. Sarebbe erroneamente restituire "foo" – JaredPar
@JaredPar - Sono disposto a conviverci. Generalmente, non inserisco valori nulli nelle mie raccolte e dovessi trovarne uno quando uso un metodo come questo, probabilmente lo sostituirò comunque con il mio valore predefinito. – tvanfosson
@tvanfosson, si tratta di un cambio sostanziale piuttosto sostanziale dall'algoritmo originale che fa una forte ipotesi su come le persone usano null. – JaredPar
?? operator. Se l'argomento di sinistra è nullo, valutare e restituire il secondo argomento.
myCollection.SingleOrDefault() ?? new[]{new Item(...)}
Questo funziona solo con i tipi di riferimento (o nullables), ma sarebbe fare quello che stai cercando in modo molto semplice.
Un piccolo applauso mi viene in mente quando uso la null coalescenza. +1 – Stimul8d
@Joe Penso che l'OP voglia effettivamente cambiare il valore predefinito che viene restituito direttamente da SingleOrDefault(), ad es. se la ricerca di un oggetto Person e nessuno esiste, allora potrebbe desiderare SingleOrDefault() per restituire un oggetto NullPerson. La mia comprensione è che non è possibile cambiare il tipo di ritorno e il problema deve essere risolto nel modo in cui lo hai fatto, ma ancora una volta penso sia importante chiarire per l'OP che il valore di ritorno predefinito di SingleOrDefault() non può essere cambiato. – Matt
- 1. Come registrare i valori predefiniti in MonoTouch?
- 2. Django imposta i valori predefiniti del modulo
- 3. Come posso modificare i valori predefiniti di una colonna della tabella mysql?
- 4. GetPrivateProfileInt- legge solo i valori predefiniti
- 5. Esistono valori predefiniti per i registri?
- 6. Allocazione memoria Dalvik - Come modificare i limiti predefiniti?
- 7. Play Framework: come modificare i pacchetti predefiniti di riproduzione?
- 8. Valori predefiniti per valori nulli
- 9. Come modificare i valori di hash?
- 10. WTForms RadioField valori predefiniti
- 11. Come faccio a sovrascrivere i valori predefiniti in jQuery Fullcalendar
- 12. Come imposto i valori predefiniti degli attributi in sqlalchemy dichiarativo?
- 13. Come impostare i valori predefiniti in un record
- 14. ergonomia Java: come vengono calcolati i valori predefiniti?
- 15. Come devo implementare i valori associati predefiniti con Swift Enums?
- 16. C# - Come saltare i parametri con valori predefiniti?
- 17. Come posso impostare i valori predefiniti usando Getopt :: Std?
- 18. Come inserire valori predefiniti nella tabella SQL?
- 19. Valori predefiniti del campo Avro
- 20. Ripristina valori predefiniti di Preferenza
- 21. VBA variabile/matrice valori predefiniti
- 22. multiselect, imposta valori predefiniti selezionati
- 23. Formbuilder angolare 2 con valori osservabili come valori predefiniti
- 24. Modo preferito per impostare i valori predefiniti delle proprietà nullable?
- 25. Valori predefiniti per i parametri facoltativi nell'argomento opzioni
- 26. I percorsi angularjs possono avere valori di parametri predefiniti?
- 27. Registrare un servizio di conversione personalizzato mantenendo i valori predefiniti?
- 28. Buoni usi per i valori predefiniti dell'argomento di funzione mutabile?
- 29. come modificare i punti UIPageControl
- 30. Come usare i wrapper predefiniti?
hai trovato una risposta? non è possibile modificare l'impostazione predefinita come promessa per metodo. perché SingleOrDefault dovrebbe essere SingleOrNull ma può restituire valore oggetto. chi può dire return 0 per int, è il numero predefinito o presunto? SingleOrDefault può restituire 0 ma non deve essere predefinito. restituisce null o no. è un cattivo paradigma per OOP. –