ich gefunden habe, ich brauche das Verhalten einen Standardwert zurückkehrt, wenn es nicht genau ein Element (dh null, zwei oder mehr) mehr oft als ich das normale SingleOrDefault
Verhalten benötigen, ist hier so meine angepasste Version von 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();
}
}
ich die null-Argument Kontrollen verzichtet habe, weil ich mit Berufung auf die Take
und Where
Anrufe OK bin Ausnahmen zu werfen, wenn die Argumente sind null, aber Sie könnten sich anders fühlen.
Danke dafür, ich benutze dies derzeit. Ich habe es in 'ExclusiveOrDefault' umbenannt und außerdem eine Extension-Methode' Exclusive' erstellt, die einen Fehler auslöst, wenn es * zero * -Elemente gibt, aber null gibt, wenn * 2 oder mehr * Elemente vorhanden sind. –