Aetheria/Assets/Scripts/NIH/LinqFaster/WhereSelect.cs
hyperion51 c58ba0b1da Copy Aetheria Code
Added a bunch of code from the old Aetheria project
2020-02-27 18:51:07 +00:00

164 lines
5.5 KiB
C#

using System;
using System.Collections.Generic;
namespace JM.LinqFaster
{
public static partial class LinqFaster
{
// -------------------------- ARRAYS --------------------------------------------
/// <summary>
/// Combined Where and Select for optimal performance.
/// </summary>
/// <param name="source">The input sequence to filter then transform.</param>
/// <param name="predicate">A function to use to filter the sequence.</param>
/// <param name="selector">A function to transform the filtered elements.</param>
/// <returns>A sequence of filtered and transformed elements.</returns>
public static TResult[] WhereSelectF<T, TResult>(this T[] source, Func<T, bool> predicate, Func<T, TResult> selector)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
if (selector == null)
{
throw Error.ArgumentNull("predicate");
}
var result = new TResult[source.Length];
int idx = 0;
for (int i = 0; i < source.Length; i++)
{
if (predicate(source[i]))
{
result[idx] = selector(source[i]);
idx++;
}
}
Array.Resize(ref result, idx);
return result;
}
/// <summary>
/// Combined Where and Select for optimal performance that uses the index in the
/// predicate and selector.
/// </summary>
/// <param name="source">The input sequence to filter then transform.</param>
/// <param name="predicate">A function to use to filter the sequence.</param>
/// <param name="selector">A function to transform the filtered elements.</param>
/// <returns>A sequence of filtered and transformed elements.</returns>
public static TResult[] WhereSelectF<T, TResult>(this T[] source, Func<T, int, bool> predicate, Func<T, int, TResult> selector)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
if (selector == null)
{
throw Error.ArgumentNull("predicate");
}
var result = new TResult[source.Length];
int idx = 0;
for (int i = 0; i < source.Length; i++)
{
if (predicate(source[i], i))
{
result[idx] = selector(source[i], idx);
idx++;
}
}
Array.Resize(ref result, idx);
return result;
}
// -------------------------- LISTS --------------------------------------------
/// <summary>
/// Combined Where and Select for optimal performance.
/// </summary>
/// <param name="source">The input sequence to filter then transform.</param>
/// <param name="predicate">A function to use to filter the sequence.</param>
/// <param name="selector">A function to transform the filtered elements.</param>
/// <returns>A sequence of filtered and transformed elements.</returns>
public static List<TResult> WhereSelectF<T, TResult>(this List<T> source, Func<T, bool> predicate, Func<T, TResult> selector)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
if (selector == null)
{
throw Error.ArgumentNull("predicate");
}
var r = new List<TResult>();
for (int i = 0; i < source.Count; i++)
{
if (predicate(source[i])) r.Add(selector(source[i]));
}
return r;
}
/// <summary>
/// Combined Where and Select for optimal performance that uses the index in the
/// predicate and selector.
/// </summary>
/// <param name="source">The input sequence to filter then transform.</param>
/// <param name="predicate">A function to use to filter the sequence.</param>
/// <param name="selector">A function to transform the filtered elements.</param>
/// <returns>A sequence of filtered and transformed elements.</returns>
public static List<TResult> WhereSelectF<T, TResult>(this List<T> source, Func<T, int, bool> predicate, Func<T, int, TResult> selector)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
if (selector == null)
{
throw Error.ArgumentNull("predicate");
}
var r = new List<TResult>();
int idx = 0;
for (int i = 0; i < source.Count; i++)
{
if (predicate(source[i], i)) {
r.Add(selector(source[i], idx));
idx++;
}
}
return r;
}
}
}