using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Npoi.Mapper; namespace JiaZhiQuan.Common.Utils.Extend { public static class DistinctExtensions { public static IEnumerable Distinct(this IEnumerable source, Func keySelector) => source.Distinct(new CommonEqualityComparer(keySelector)); } public static class IEnumerableExtension { public static List BlockDeal(this IEnumerable source, Func, T> deal, int startBlockNum = 0, int blockSize = 100) { List result = new List(); if (source == null || source.Count() == 0) return result; int startNum = startBlockNum * blockSize; int count = source.Count(); while (startNum < count) { int size = count - startNum > blockSize ? blockSize : count - startNum; IEnumerable dealList = source.Skip(startNum).Take(size); result.Add(deal(dealList)); startNum += size; } return result; } public static async Task> BlockDealAsync(this IEnumerable source, Func, Task> deal, int startBlockNum = 0, int blockSize = 100) { List result = new List(); if (source == null || source.Count() == 0) return result; int startNum = startBlockNum * blockSize; int count = source.Count(); while (startNum < count) { int size = count - startNum > blockSize ? blockSize : count - startNum; IEnumerable dealList = source.Skip(startNum).Take(size); result.Add(await deal(dealList)); startNum += size; } return result; } } public class CommonEqualityComparer : IEqualityComparer { private readonly Func keySelector; public CommonEqualityComparer(Func keySelector) { this.keySelector = keySelector; } public bool Equals(T x, T y) { return EqualityComparer.Default.Equals(keySelector(x), keySelector(y)); } public int GetHashCode(T obj) { return EqualityComparer.Default.GetHashCode(keySelector(obj)); } } }