tôi đã tìm thấy tôi cần những hành vi trả lại một giá trị mặc định nếu không có đúng một phần tử (tức là không, hai, hoặc nhiều hơn) hơn thường xuyên hơn tôi cần SingleOrDefault
hành vi bình thường, vì vậy đây là phiên bản chuyển thể của tôi về 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();
}
}
tôi đã bỏ qua kiểm tra đối số null bởi vì tôi là OK với dựa vào Take
và Where
cuộc gọi để ném ngoại lệ khi đối số là null, nhưng bạn có thể cảm thấy khác.
Nguồn
2014-08-15 00:23:13
Cảm ơn vì điều này, tôi hiện đang sử dụng tính năng này. Tôi đổi tên nó thành 'ExclusiveOrDefault' và cũng đã thực hiện một phương thức mở rộng' Exclusive' để ném lỗi khi có * zero * elements, nhưng trả về null khi có * 2 hoặc nhiều hơn * elements. –