Compare commits

...

2 Commits

Author SHA1 Message Date
Adrian 2b0d56b1a2 ForEach for dictionaries 2016-02-22 16:25:44 +01:00
Adrian b6c478dcff Eager evaluation in Enumerables, other minor changes
* Eager evaluation of iterating functions,
  they are already in System.Linq
* Remove index parameters in functions
* Create array or list of anonymous objects
* Dictionary creation
* ToArray and ToList
2016-02-22 01:13:05 +01:00
1 changed files with 104 additions and 34 deletions

View File

@ -10,30 +10,53 @@ namespace AdrianKousz.Util
{ {
#region Fillers #region Fillers
public static T[] Fill<T>(this T[] array) where T : new() { return Fill(array, i => new T()); } public static T[] Fill<T>(this T[] array) where T : new() { return Fill(array, () => new T()); }
public static T[] Fill<T>(this T[] array, T value) { return Fill(array, i => value); } public static T[] Fill<T>(this T[] array, T value) { return Fill(array, () => value); }
public static T[] Fill<T>(this T[] array, Func<T> f) { return Fill(array, i => f()); } public static T[] Fill<T>(this T[] array, Func<T> f)
public static T[] Fill<T>(this T[] array, Func<int, T> f)
{ {
var min = array.GetLowerBound(0); var len = array.Length;
var max = array.GetUpperBound(0); for (var i = 0; i < len; i++) array[i] = f();
for (var i = min; i <= max; i++)
array[i] = f(i);
return array; return array;
} }
public static IList<T> Fill<T>(this IList<T> list, int count) where T : new() { return Fill(list, i => new T(), count); } public static ICollection<T> Fill<T>(this ICollection<T> list, int count) where T : new() { return Fill(list, count, () => new T()); }
public static IList<T> Fill<T>(this IList<T> list, T value, int count) { return Fill(list, i => value, count); } public static ICollection<T> Fill<T>(this ICollection<T> list, int count, T value) { return Fill(list, count, () => value); }
public static IList<T> Fill<T>(this IList<T> list, Func<T> f, int count) { return Fill(list, i => f(), count); } public static ICollection<T> Fill<T>(this ICollection<T> list, int count, Func<T> f)
public static IList<T> Fill<T>(this IList<T> list, Func<int, T> f, int count)
{ {
for (var i = 0; i < count; i++) for (var i = 0; i < count; i++) list.Add(f());
list.Add(f(i));
return list; return list;
} }
#endregion #endregion
#region Anonymous Type Helpers
public static T[] CreateArray<T>(this T example, int count)
{
return new T[count];
}
public static List<T> CreateList<T>(this T example)
{
return new List<T>();
}
#endregion
#region Materializers
public static List<T> ToList<T>(this IEnumerable<T> source)
{
return source as List<T> ?? new List<T>(source);
}
public static T[] ToArray<T>(this IEnumerable<T> source)
{
return source as T[] ?? ToList(source).ToArray();
}
#endregion
#region Functional Classics #region Functional Classics
public static int IndexOf<T>(this IEnumerable<T> source, T value, Func<T, T, bool> comparer) public static int IndexOf<T>(this IEnumerable<T> source, T value, Func<T, T, bool> comparer)
@ -46,58 +69,105 @@ namespace AdrianKousz.Util
return -1; return -1;
} }
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> f) { return ForEach(source, (i, x) => f(x)); } public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> f)
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<int, T> f)
{ {
var i = 0; foreach (var el in source) f(el);
foreach (var el in source) f(i++, el); return source;
}
public static IDictionary<K, V> ForEach<K, V>(this IDictionary<K, V> source, Action<K, V> f)
{
foreach (var el in source) f(el.Key, el.Value);
return source; return source;
} }
// Linq: Select // Linq: Select
public static IEnumerable<TResult> Map<T, TResult>(this IEnumerable<T> source, Func<T, TResult> f) public static IEnumerable<TResult> Map<T, TResult>(this IEnumerable<T> source, Func<T, TResult> f)
{ {
foreach (var el in source) yield return f(el); var result = GetList<T, TResult>(source);
foreach (var el in source) result.Add(f(el));
return result;
} }
// Linq: Where // Linq: Where
public static IEnumerable<T> Filter<T>(this IEnumerable<T> source, Func<T, bool> f) public static IEnumerable<T> Filter<T>(this IEnumerable<T> source, Func<T, bool> f)
{ {
foreach (var el in source) if (f(el)) yield return el; var result = GetList<T, T>(source);
foreach (var el in source) if (f(el)) result.Add(el);
return result;
} }
public static TResult FoldL<T, TResult>(this IEnumerable<T> source, TResult initial, Action<TResult, T> f) public static TResult FoldL<T, TResult>(this IEnumerable<T> source, TResult initial, Action<TResult, T> f)
{ return FoldL(source, initial, (folded, el) => { f(folded, el); return folded; }); } { return FoldL(source, initial, (folded, el) => { f(folded, el); return folded; }); }
public static TResult FoldL<T, TResult>(this IEnumerable<T> source, TResult initial, Func<TResult, T, TResult> f) public static TResult FoldL<T, TResult>(this IEnumerable<T> source, TResult initial, Func<TResult, T, TResult> f)
{ {
var folded = initial; var result = initial;
foreach (var el in source) folded = f(folded, el); foreach (var el in source) result = f(result, el);
return folded; return result;
} }
// Linq: Aggregate // Linq: Aggregate
public static T FoldL1<T>(this IEnumerable<T> source, Func<T, T, T> f) public static T FoldL1<T>(this IEnumerable<T> source, Func<T, T, T> f)
{ {
using (var en = source.GetEnumerator()) { using (var en = source.GetEnumerator())
{
if (!en.MoveNext()) throw new InvalidOperationException("No elements"); if (!en.MoveNext()) throw new InvalidOperationException("No elements");
T folded = en.Current; T result = en.Current;
while (en.MoveNext()) folded = f(folded, en.Current); while (en.MoveNext()) result = f(result, en.Current);
return folded; return result;
} }
} }
#endregion
#region Zippers
public static IDictionary<K, V> ToDictionary<K, V>(this IEnumerable<K> ks, IEnumerable<V> vs)
{
var result = new Dictionary<K, V>();
using (var en1 = ks.GetEnumerator())
using (var en2 = vs.GetEnumerator())
{
while (en1.MoveNext() && en2.MoveNext())
result[en1.Current] = en2.Current;
}
return result;
}
public static IDictionary<T, T> ToDictionary<T>(this IEnumerable<T> source)
{
var result = new Dictionary<T, T>();
var iskey = true;
var k = default(T);
foreach (var el in source)
if (iskey = !iskey) result[k] = el;
else k = el;
return result;
}
public static IEnumerable<TResult> Zip<T1, T2, TResult>(this IEnumerable<T1> s1, IEnumerable<T2> s2, Func<T1, T2, TResult> f) public static IEnumerable<TResult> Zip<T1, T2, TResult>(this IEnumerable<T1> s1, IEnumerable<T2> s2, Func<T1, T2, TResult> f)
{ {
using (var en1 = s1.GetEnumerator()) { var result = GetList<T1, TResult>(s1);
using (var en2 = s2.GetEnumerator()) { using (var en1 = s1.GetEnumerator())
while (en1.MoveNext() && en2.MoveNext()) { using (var en2 = s2.GetEnumerator())
yield return f(en1.Current, en2.Current); {
} while (en1.MoveNext() && en2.MoveNext())
} result.Add(f(en1.Current, en2.Current));
} }
return result;
}
#endregion
#region Implementation Detail
private static List<TResult> GetList<T, TResult>(IEnumerable<T> source)
{
var collection = source as ICollection<T>;
var length = collection == null ? 4 : collection.Count;
return new List<TResult>(length);
} }
#endregion #endregion
} }
} }