public static TSource Single <TEnumerable, TEnumerator, TSource>(this TEnumerable source)
            where TEnumerable : IReadOnlyCollection <TSource>
            where TEnumerator : IEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            var count = source.Count;

            if (count == 0)
            {
                ThrowHelper.ThrowEmptySequence <TSource>();
            }
            if (count > 1)
            {
                ThrowHelper.ThrowNotSingleSequence <TSource>();
            }

            using (var enumerator = Dynamic.GetEnumerator <TEnumerable, TEnumerator, TSource> .Invoke(source))
            {
                enumerator.MoveNext();
                return(enumerator.Current);
            }
        }
        public static TSource Single <TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func <TSource, bool> predicate)
            where TEnumerable : IValueReadOnlyList <TSource, TEnumerator>
            where TEnumerator : struct, IValueEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            var count = source.Count();

            if (count == 0)
            {
                ThrowHelper.ThrowEmptySequence <TSource>();
            }

            for (var index = 0; index < count; index++)
            {
                if (predicate(source[index]))
                {
                    var first = source[index];

                    for (index++; index < count; index++)
                    {
                        if (predicate(source[index]))
                        {
                            ThrowHelper.ThrowNotSingleSequence <TSource>();
                        }
                    }

                    return(first);
                }
            }
            return(ThrowHelper.ThrowEmptySequence <TSource>());
        }
        public static TSource Single <TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func <TSource, bool> predicate)
            where TEnumerable : IValueEnumerable <TSource, TEnumerator>
            where TEnumerator : struct, IValueEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            using (var enumerator = source.GetValueEnumerator())
            {
                while (enumerator.TryMoveNext(out var first))
                {
                    if (predicate(first))
                    {
                        // found first, keep going until end or find second
                        while (enumerator.TryMoveNext(out var current))
                        {
                            if (predicate(current))
                            {
                                ThrowHelper.ThrowNotSingleSequence <TSource>();
                            }
                        }
                        return(first);
                    }
                }
                return(ThrowHelper.ThrowEmptySequence <TSource>());
            }
        }
Beispiel #4
0
        public static TSource Single <TEnumerable, TEnumerator, TSource>(this TEnumerable source)
            where TEnumerable : IValueReadOnlyCollection <TSource, TEnumerator>
            where TEnumerator : struct, IValueEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            var count = source.Count();

            if (count == 0)
            {
                ThrowHelper.ThrowEmptySequence <TSource>();
            }
            if (count > 1)
            {
                ThrowHelper.ThrowNotSingleSequence <TSource>();
            }

            using (var enumerator = source.GetValueEnumerator())
            {
                enumerator.TryMoveNext(out var current);
                return(current);
            }
        }
Beispiel #5
0
        public static TSource First <TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func <TSource, bool> predicate)
            where TEnumerable : IReadOnlyList <TSource>
            where TEnumerator : IEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            var count = source.Count;

            if (count == 0)
            {
                ThrowHelper.ThrowEmptySequence <TSource>();
            }

            for (var index = 0; index < count; index++)
            {
                if (predicate(source[index]))
                {
                    return(source[index]);
                }
            }
            return(ThrowHelper.ThrowEmptySequence <TSource>());
        }
Beispiel #6
0
        public static TSource Single <TEnumerable, TEnumerator, TSource>(this TEnumerable source)
            where TEnumerable : IEnumerable <TSource>
            where TEnumerator : IEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            using (var enumerator = Dynamic.GetEnumerator <TEnumerable, TEnumerator, TSource> .Invoke(source))
            {
                if (!enumerator.MoveNext())
                {
                    ThrowHelper.ThrowEmptySequence <TSource>();
                }

                var first = enumerator.Current;

                if (enumerator.MoveNext())
                {
                    ThrowHelper.ThrowNotSingleSequence <TSource>();
                }

                return(first);
            }
        }
Beispiel #7
0
        public static TSource Single <TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func <TSource, bool> predicate)
            where TEnumerable : IEnumerable <TSource>
            where TEnumerator : IEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            using (var enumerator = Dynamic.GetEnumerator <TEnumerable, TEnumerator, TSource> .Invoke(source))
            {
                while (enumerator.MoveNext())
                {
                    var first = enumerator.Current;
                    if (predicate(first))
                    {
                        // found first, keep going until end or find second
                        while (enumerator.MoveNext())
                        {
                            if (predicate(enumerator.Current))
                            {
                                ThrowHelper.ThrowNotSingleSequence <TSource>();
                            }
                        }
                        return(first);
                    }
                }
                return(ThrowHelper.ThrowEmptySequence <TSource>());
            }
        }
Beispiel #8
0
        public static ref readonly TSource First <TSource>(this ReadOnlySpan <TSource> source)
        {
            if (source.Length == 0)
            {
                ThrowHelper.ThrowEmptySequence <TSource>();
            }

            return(ref source[0]);
        public static ref readonly TSource First <TSource>(this TSource[] source)
        {
            if (source is null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }
            if (source.Length == 0)
            {
                ThrowHelper.ThrowEmptySequence <TSource>();
            }

            return(ref source[0]);
Beispiel #10
0
        public static TSource First <TEnumerable, TEnumerator, TSource>(this TEnumerable source)
            where TEnumerable : IValueReadOnlyList <TSource, TEnumerator>
            where TEnumerator : struct, IValueEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }
            if (source.Count() == 0)
            {
                ThrowHelper.ThrowEmptySequence <TSource>();
            }

            return(source[0]);
        }
        public static TSource First <TEnumerable, TEnumerator, TSource>(this TEnumerable source)
            where TEnumerable : IValueEnumerable <TSource, TEnumerator>
            where TEnumerator : struct, IValueEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            using (var enumerator = source.GetValueEnumerator())
            {
                if (enumerator.TryMoveNext(out var current))
                {
                    return(current);
                }

                ThrowHelper.ThrowEmptySequence <TSource>();
                return(default);
Beispiel #12
0
        public static TSource Single <TEnumerable, TEnumerator, TSource>(this TEnumerable source)
            where TEnumerable : IReadOnlyList <TSource>
            where TEnumerator : IEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            var count = source.Count;

            if (count == 0)
            {
                ThrowHelper.ThrowEmptySequence <TSource>();
            }
            if (count > 1)
            {
                ThrowHelper.ThrowNotSingleSequence <TSource>();
            }

            return(source[0]);
        }
Beispiel #13
0
        public static TSource First <TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func <TSource, bool> predicate)
            where TEnumerable : IEnumerable <TSource>
            where TEnumerator : IEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            using (var enumerator = Dynamic.GetEnumerator <TEnumerable, TEnumerator, TSource> .Invoke(source))
            {
                while (enumerator.MoveNext())
                {
                    var current = enumerator.Current;
                    if (predicate(current))
                    {
                        return(current);
                    }
                }
                return(ThrowHelper.ThrowEmptySequence <TSource>());
            }
        }
        public static TSource Single <TEnumerable, TEnumerator, TSource>(this TEnumerable source)
            where TEnumerable : IValueEnumerable <TSource, TEnumerator>
            where TEnumerator : struct, IValueEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            using (var enumerator = source.GetValueEnumerator())
            {
                if (!enumerator.TryMoveNext(out var first))
                {
                    ThrowHelper.ThrowEmptySequence <TSource>();
                }

                if (enumerator.TryMoveNext())
                {
                    ThrowHelper.ThrowNotSingleSequence <TSource>();
                }

                return(first);
            }
        }