Beispiel #1
0
 internal UnionReadOnlyFiniteSet(
     IReadOnlyFiniteSet <TSource> first,
     IReadOnlyFiniteSet <TSource> second,
     int count)
 {
     _first  = first;
     _second = second;
     _count  = count;
 }
Beispiel #2
0
 internal SymmetricExceptReadOnlyFiniteSet(
     IReadOnlyFiniteSet <TSource> first,
     IReadOnlyFiniteSet <TSource> second,
     int count)
 {
     _first  = first;
     _second = second;
     _count  = count;
 }
Beispiel #3
0
        public static IReadOnlyFiniteSet <TSource> DefaultIfEmpty <TSource> (this IReadOnlyFiniteSet <TSource> source, TSource defaultValue = default(TSource))
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            Contract.EndContractBlock();

            return((source.Count > 0) ? source : new OneItemReadOnlyFiniteSet <TSource> (defaultValue, null));
        }
Beispiel #4
0
        public static IReadOnlyFiniteSet <TSource> Distinct <TSource> (
            this IReadOnlyFiniteSet <TSource> source,
            IEqualityComparer <TSource> notUsed = null)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            Contract.EndContractBlock();

            return(source);
        }
Beispiel #5
0
        public static bool Contains <TSource> (
            this IReadOnlyFiniteSet <TSource> source,
            TSource value,
            IEqualityComparer <TSource> notUsed = null)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            Contract.EndContractBlock();

            return(source.Contains(value));
        }
Beispiel #6
0
        public static IReadOnlyFiniteSet <TSource> Except <TSource> (
            this IReadOnlyFiniteSet <TSource> first,
            IReadOnlyFiniteSet <TSource> second,
            IEqualityComparer <TSource> notUsed = null)
        {
            if (first == null)
            {
                throw new ArgumentNullException("first");
            }
            if (second == null)
            {
                throw new ArgumentNullException("second");
            }
            Contract.EndContractBlock();

            if ((first.Count < 1) || (second.Count < 1))
            {
                return(first);
            }
            if (first == second)
            {
                return(ReadOnlyList.EmptyReadOnlyList <TSource> .GetInstance());
            }

            // заранее считаем количество элементов
            int count = first.Count;

            if (first.Count < second.Count)
            {
                foreach (var item in first)
                {
                    if (second.Contains(item))
                    {
                        count--;
                    }
                }
            }
            else
            {
                foreach (var item in second)
                {
                    if (first.Contains(item))
                    {
                        count--;
                    }
                }
            }

            return(new ExceptReadOnlyFiniteSet <TSource> (first, second, count));
        }
Beispiel #7
0
        /// <summary>
        /// Изменяет порядок элементов указанного конечного множества на противоположный.
        /// </summary>
        /// <typeparam name="TSource">Тип элементов множества.</typeparam>
        /// <param name="source">Множество, элементы которого следует расставить в обратном порядке.</param>
        /// <returns>Множество, элементы которого содержат те же элементы, но следуют в противоположном порядке.</returns>
        public static IReadOnlyFiniteSet <TSource> Reverse <TSource> (this IReadOnlyFiniteSet <TSource> source)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            Contract.EndContractBlock();

            if (source.Count < 2)
            {
                return(source);
            }
            return(new ReverseReadOnlyFiniteSet <TSource> (source));
        }
Beispiel #8
0
        public static IReadOnlyFiniteSet <TSource> Union <TSource> (
            this IReadOnlyFiniteSet <TSource> first,
            IReadOnlyFiniteSet <TSource> second,
            IEqualityComparer <TSource> notUsed = null)
        {
            if (first == null)
            {
                throw new ArgumentNullException("first");
            }
            if (second == null)
            {
                throw new ArgumentNullException("second");
            }
            Contract.EndContractBlock();

            if (first.Count < 1)
            {
                return(second);
            }
            if ((second.Count < 1) || (first == second))
            {
                return(first);
            }

            // делаем первым тот, в котором больше элементов
            if (first.Count < second.Count)
            {
                var ttt = first;
                first  = second;
                second = ttt;
            }

            // заранее считаем количество элементов
            int count = first.Count;

            foreach (var item in second)
            {
                if (!first.Contains(item))
                {
                    count++;
                }
            }

            return(new UnionReadOnlyFiniteSet <TSource> (first, second, count));
        }
Beispiel #9
0
 internal ReverseReadOnlyFiniteSet(IReadOnlyFiniteSet <TSource> source)
 {
     _source = source;
 }