コード例 #1
0
ファイル: Set.cs プロジェクト: ufcpp/LinqToArray
        /// <summary>
        /// Array optimized
        /// source.Distinct().ToArray()
        /// </summary>
        public static unsafe T[] DistinctToArray <T, TComp>(this T[] source)
            where TComp : struct, IEqualityComparer <T>
        {
            var len     = PowerOf2(source.Length * 2);
            var buckets = stackalloc int[len];
            var set     = new StackHashSet <T, TComp>(source, buckets, len);

            var resultIndexes = stackalloc int[source.Length];
            var count         = 0;

            for (int i = 0; i < source.Length; i++)
            {
                if (!set.Add(source[i], i))
                {
                    resultIndexes[count++] = i;
                }
            }

            return(ToArray(source, resultIndexes, count));
        }
コード例 #2
0
ファイル: Set.cs プロジェクト: ufcpp/LinqToArray
        /// <summary>
        /// Array optimized
        /// first.Except(second).ToArray()
        /// </summary>
        public static unsafe T[] ExceptToArray <T, TComp>(this T[] first, T[] second)
            where TComp : struct, IEqualityComparer <T>
        {
            var len     = PowerOf2(second.Length * 2);
            var buckets = stackalloc int[len];
            var set     = new StackHashSet <T, TComp>(second, buckets, len);

            set.MakeHashtTable();

            var resultIndexes = stackalloc int[first.Length];
            var count         = 0;

            for (int i = 0; i < first.Length; i++)
            {
                if (!set.Contains(first[i]))
                {
                    resultIndexes[count++] = i;
                }
            }

            return(ToArray(first, resultIndexes, count));
        }