skynyrd
10/4/2016 - 1:35 PM

IEnumerable extensions

IEnumerable extensions

// C#, Extension, IEnumerable

namespace Hepsi.Domain.Common.Extensions
{
    public static class IEnumerableExtensions
    {
        public static IEnumerable<TOut> SelectParallel<T, TOut>(
        this IEnumerable<T> source,
        int pageSize,
        Func<List<T>, IEnumerable<TOut>> func)
        {
            var list = source as IList<T> ?? source.ToList();
            var totalcount = list.Count;
            var totalPages = (int)Math.Ceiling(totalcount / (double)pageSize);
            var tasks = Enumerable.Range(0, totalPages)
                .Select(i => Task.FromResult(
                    func(list.Skip(pageSize * i).Take(pageSize).ToList())));

            return Task.WhenAll(tasks).Result.SelectMany(t => t);
        }

        public static List<List<T>> ChunkBy<T>(this IList<T> source, int chunkSize)
        {
            return source
                .Select((x, i) => new { Index = i, Value = x })
                .GroupBy(x => x.Index / chunkSize)
                .Select(x => x.Select(v => v.Value).ToList())
                .ToList();
        }

        public static void ForEachIfExists<T>(this List<T> list, Action<T> action)
        {
            if (list == null)
                return;
            list.ForEach(action);
        }

        public static IEnumerable<T> SafeSelect<T, U>(this IEnumerable<U> source, Func<U, T> selector)
        {
            if (source == null)
                return Enumerable.Empty<T>();
            return source.Select<U, T>(selector);
        }
    }
}