internal UnionReadOnlyFiniteSet( IReadOnlyFiniteSet <TSource> first, IReadOnlyFiniteSet <TSource> second, int count) { _first = first; _second = second; _count = count; }
internal SymmetricExceptReadOnlyFiniteSet( IReadOnlyFiniteSet <TSource> first, IReadOnlyFiniteSet <TSource> second, int count) { _first = first; _second = second; _count = count; }
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)); }
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); }
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)); }
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)); }
/// <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)); }
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)); }
internal ReverseReadOnlyFiniteSet(IReadOnlyFiniteSet <TSource> source) { _source = source; }