que he encontrado que necesito el comportamiento de devolver un valor por defecto si no hay exactamente un elemento (es decir, cero, dos, o más) más a menudo de lo que necesito el SingleOrDefault
comportamiento normal, así que aquí está mi versión adaptada de Pieter van Ginkel's answer:
public static class LinqExtensions
{
/// <summary>
/// Returns the only element of a sequence, or a default value if the sequence is empty or contains more than one element.
/// </summary>
public static TSource SingleOrDefaultIfMultiple<TSource>(this IEnumerable<TSource> source)
{
var elements = source.Take(2).ToArray();
return (elements.Length == 1) ? elements[0] : default(TSource);
}
/// <summary>
/// Returns the only element of a sequence, or a default value if the sequence is empty or contains more than one element.
/// </summary>
public static TSource SingleOrDefaultIfMultiple<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
return source.Where(predicate).SingleOrDefaultIfMultiple();
}
/// <summary>
/// Returns the only element of a sequence, or a default value if the sequence is empty or contains more than one element.
/// </summary>
public static TSource SingleOrDefaultIfMultiple<TSource>(this IQueryable<TSource> source)
{
var elements = source.Take(2).ToArray();
return (elements.Length == 1) ? elements[0] : default(TSource);
}
/// <summary>
/// Returns the only element of a sequence, or a default value if the sequence is empty or contains more than one element.
/// </summary>
public static TSource SingleOrDefaultIfMultiple<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
return source.Where(predicate).SingleOrDefaultIfMultiple();
}
}
he omitido los controles argumentos son nulos porque yo estoy bien con depender de los Take
y Where
llamadas a lanzar excepciones cuando las los argumentos son nulos, pero puede que pienses lo contrario.
Gracias por esto, estoy usando esto actualmente. Cambié el nombre a 'ExclusiveOrDefault' y también hice un método de extensión' Exclusive' que arroja un error cuando hay * elementos * cero *, pero devuelve nulo cuando hay * 2 o más * elementos. –