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

            if (source.Count == 0)
            {
                return(null);
            }

            using (var enumerator = Dynamic.GetEnumerator <TEnumerable, TEnumerator, TSource> .Invoke(source))
            {
                enumerator.MoveNext();
                return(enumerator.Current);
            }
        }
示例#2
0
        public static bool Contains <TEnumerable, TEnumerator, TSource>(this TEnumerable source, TSource value, IEqualityComparer <TSource> comparer = null)
            where TEnumerable : IValueReadOnlyList <TSource, TEnumerator>
            where TEnumerator : struct, IValueEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            var count = source.Count();

            if (count == 0)
            {
                return(false);
            }

            if (comparer is null)
            {
                for (var index = 0; index < count; index++)
                {
                    if (EqualityComparer <TSource> .Default.Equals(source[index], value))
                    {
                        return(true);
                    }
                }
            }
            else
            {
                for (var index = 0; index < count; index++)
                {
                    if (comparer.Equals(source[index], value))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
        public static bool Contains <TEnumerable, TEnumerator, TSource>(this TEnumerable source, TSource value, IEqualityComparer <TSource> comparer = null)
            where TEnumerable : IValueEnumerable <TSource, TEnumerator>
            where TEnumerator : struct, IValueEnumerator <TSource>
        {
            if (source == null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(source));
            }

            if (comparer is null)
            {
                using (var enumerator = source.GetValueEnumerator())
                {
                    while (enumerator.TryMoveNext(out var current))
                    {
                        if (EqualityComparer <TSource> .Default.Equals(current, value))
                        {
                            return(true);
                        }
                    }
                }
            }
            else
            {
                using (var enumerator = source.GetValueEnumerator())
                {
                    while (enumerator.TryMoveNext(out var current))
                    {
                        if (comparer.Equals(current, value))
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
        public static bool Any <TSource>(this Span <TSource> source, Func <TSource, bool> predicate)
        {
            if (predicate is null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(predicate));
            }

            var length = source.Length;

            if (length == 0)
            {
                return(false);
            }

            for (var index = 0; index < length; index++)
            {
                if (predicate(source[index]))
                {
                    return(true);
                }
            }
            return(false);
        }
        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);
            }
        }