SingleOrDefault devuelve nulo, pero ¿qué sucede si deseo asignar valores para representar el objeto que no se encontró?SingleOrDefault: ¿Cómo cambiar los valores predeterminados?
Respuesta
Puedes enrollar el tuyo.
public static T SingleOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
if (1 != enumerable.Count()) {
return defaultValue;
}
return enumerable.Single();
}
Esto puede ser un poco caro, porque aunque Count() se requiere para procesar toda la colección y puede ser bastante caro de mantener. Sería mejor que sea una sola llamada, coger el InvalidOperationException o rodar un método 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();
}
Esto devolvería el valor predeterminado si el enumerable contiene múltiples objetos. ¿No debería arrojar una excepción como lo hace la implementación estándar? – tvanfosson
@tvanfosson, sí, debería. Tenía la impresión de que SingleOrDefault devolvería el valor predeterminado si había algo más que un elemento. Pero aparentemente solo lo hará sin elementos. Raro, voy a actualizar. – JaredPar
Se puede crear sus propios métodos de extensión - 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;
}
}
El problema con este enfoque es que devolverá el parámetro newValue para una colección que contiene un elemento único con el valor nulo. Considere esta expresión (nueva cadena [] {nulo}). SingleOrNew ("foo") ;. Sería incorrecto devolver "foo" – JaredPar
@JaredPar - Estoy dispuesto a vivir con eso. En general, no pongo valores nulos en mis colecciones y si encontrara uno al usar un método como este, probablemente querría reemplazarlo con mi valor predeterminado de todos modos. – tvanfosson
@tvanfosson, ese es un cambio radical bastante sustancial del algoritmo original que hace una suposición fuerte acerca de cómo las personas usan nulo. – JaredPar
?? operator. Si el argumento de la izquierda es nulo, evalúe y devuelva el segundo argumento.
myCollection.SingleOrDefault() ?? new[]{new Item(...)}
esto sólo funcionará con los tipos de referencia (o nullables), pero sería hacer lo que está buscando de manera muy sencilla.
Una pequeña ronda de aplausos se dispara en mi cabeza cuando utilizo la coalescencia nula. +1 – Stimul8d
@Joe Creo que el OP realmente quiere cambiar el valor predeterminado que se devuelve directamente de SingleOrDefault(), p. si busca un objeto Persona y no existe ninguno, puede desear que SingleOrDefault() devuelva un objeto NullPerson. Según entiendo, no es posible cambiar el tipo de devolución y el problema debe resolverse de la manera en que lo hizo, pero de nuevo, creo que es importante aclarar para el OP que el valor de retorno predeterminado de SingleOrDefault() no puede ser cambiado – Matt
- 1. cambiar los valores predeterminados de un Plugin
- 2. ¿Cómo registro los valores predeterminados en MonoTouch?
- 3. Configuración de los valores predeterminados de AssemblyInfo.cs
- 4. comportamiento de los valores predeterminados inconsistentes (NSUserDefaults) en los valores predeterminados del simulador de iPhone
- 5. Django establece los valores de formulario predeterminados
- 6. GetPrivateProfileInt- leyendo solo los valores predeterminados
- 7. MVC redirigir a los valores predeterminados ruta
- 8. Cambiar los estilos predeterminados de Github
- 9. attr_accessor valores predeterminados
- 10. ¿Cómo/dónde definir los valores predeterminados de fancybox?
- 11. Método de traducción HTML5, cómo restablecer a los valores predeterminados?
- 12. ¿Cómo se restablecen los valores predeterminados para VI?
- 13. Cómo establecer los valores predeterminados del diálogo JTry UI
- 14. Cómo puedo anular los valores predeterminados en jQuery Fullcalendar
- 15. Marco de juego: ¿Cómo cambiar los paquetes predeterminados de juego?
- 16. Dalvik Memory Allocation - ¿Cómo cambiar los límites predeterminados?
- 17. ¿Cómo registrar los valores predeterminados del usuario utilizando NSUserDefaults sin sobreescribir los valores existentes?
- 18. XML Serialización de los valores predeterminados de los atributos opcionales
- 19. local androide cambia aleatoriamente a los valores predeterminados
- 20. ¿Cómo cambiar los valores de Hash?
- 21. C# - ¿Cómo saltarse parámetros con valores predeterminados?
- 22. Acceso a los valores de argumento predeterminados en Python
- 23. LINQ to SQL valores predeterminados
- 24. Búsqueda de diccionario anidada en Python con los valores predeterminados
- 25. J2EE: valores predeterminados para los atributos de etiquetas personalizadas
- 26. Valores predeterminados de memoria JVM
- 27. Cómo configurar los valores predeterminados para un parámetro con varios valores para un plugin Maven
- 28. ¿Cómo establecer los valores predeterminados para los campos en los registros en Clojure?
- 29. ¿Cómo establecer los valores predeterminados para los parámetros de los métodos de url helper?
- 30. ¿Cuáles son los valores predeterminados para @property en iOS?
¿Encontró alguna respuesta? no puede cambiar el valor predeterminado como promesas por método. porque SingleOrDefault debe ser SingleOrNull pero puede devolver el objeto de valor. ¿Quién puede decir return 0 for int, es el número predeterminado o supuesto? SingleOrDefault puede devolver 0 pero no debe ser predeterminado. return null o no. es un mal paradigma para OOP. –