using System; namespace MemoryPools.Collections.Linq { public static partial class PoolingEnumerable { public static T Single<T>(this IPoolingEnumerable<T> source) { var wasFound = false; var element = default(T); var enumerator = source.GetEnumerator(); while (enumerator.MoveNext()) { if (wasFound) { enumerator.Dispose(); throw new InvalidOperationException("Sequence should contain only one element"); } wasFound = true; element = enumerator.Current; } enumerator.Dispose(); return element; } public static T Single<T>(this IPoolingEnumerable<T> source, Func<T, bool> condition) { var wasFound = false; var element = default(T); var enumerator = source.GetEnumerator(); while (enumerator.MoveNext()) { if (condition(enumerator.Current)) { if (wasFound) { enumerator.Dispose(); throw new InvalidOperationException("Sequence should contain only one element"); } wasFound = true; element = enumerator.Current; } } enumerator.Dispose(); return element; } public static T Single<T, TContext>(this IPoolingEnumerable<T> source, TContext context, Func<TContext, T, bool> condition) { var wasFound = false; var element = default(T); var enumerator = source.GetEnumerator(); while (enumerator.MoveNext()) { if (condition(context, enumerator.Current)) { if (wasFound) { enumerator.Dispose(); throw new InvalidOperationException("Sequence should contain only one element"); } wasFound = true; element = enumerator.Current; } } enumerator.Dispose(); return element; } public static T SingleOrDefault<T>(this IPoolingEnumerable<T> source) { var wasFound = false; var element = default(T); var enumerator = source.GetEnumerator(); while (enumerator.MoveNext()) { if (wasFound) { enumerator.Dispose(); return default; } wasFound = true; element = enumerator.Current; } enumerator.Dispose(); return element; } public static T SingleOrDefault<T>(this IPoolingEnumerable<T> source, Func<T, bool> condition) { var wasFound = false; var element = default(T); var enumerator = source.GetEnumerator(); while (enumerator.MoveNext()) { if (condition(enumerator.Current)) { if (wasFound) { enumerator.Dispose(); return default; } wasFound = true; element = enumerator.Current; } } enumerator.Dispose(); return element; } public static T SingleOrDefault<T, TContext>(this IPoolingEnumerable<T> source, TContext context, Func<TContext, T, bool> condition) { var wasFound = false; var element = default(T); var enumerator = source.GetEnumerator(); while (enumerator.MoveNext()) { if (condition(context, enumerator.Current)) { if (wasFound) { enumerator.Dispose(); return default; } wasFound = true; element = enumerator.Current; } } enumerator.Dispose(); return element; } } }