/// <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)); }
/// <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)); }