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