namespace AdventOfCode.Utils.Extensions;
public static class LinqExtensions
{
///
/// Returns a slice of the given list
///
/// The list you pretend to slice
/// The first index of the slice
/// The index after the last index of the slice
///
public static List Sublist(this List list, int startIndex, int endIndex = default)
{
List result = new List();
if (endIndex == default)
endIndex = list.Count;
for (int i = startIndex; i < endIndex; i++)
result.Add(list[i]);
return result;
}
///
/// Returns a column of a give matrix list
///
/// 2 dimensions list
/// Column index
///
public static List GetColumn(this List> list, int column)
{
List result = new List();
foreach (List row in list) result.AddRange(row.Where((t, i) => i == column));
return result;
}
///
/// Reverses a given list
///
/// The list to reverse
/// The reversed list
public static List Reversed(this List list)
{
List reversed = new List();
for (int i = 0; i < list.Count; i++)
reversed.Add(list[list.Count-1-i]);
return reversed;
}
///
/// Clones a list of elements
///
/// The original list
/// A copy of the original list
public static List Clone(this List original)
{
List ret = new List(original.Count);
foreach (T element in original)
ret.Add(element);
return ret;
}
public static Dictionary Clone
(this Dictionary original)
where TValue : ICloneable
where TKey : notnull
{
Dictionary ret = new Dictionary(original.Count, original.Comparer);
foreach (KeyValuePair entry in original)
ret.Add(entry.Key, (TValue) entry.Value.Clone());
return ret;
}
public static Dictionary> Clone
(this Dictionary> original)
where TKey : notnull
{
Dictionary> ret = new Dictionary>(original.Count, original.Comparer);
foreach (KeyValuePair> entry in original)
ret.Add(entry.Key, entry.Value.Clone());
return ret;
}
public static void Fill(this List list, int count, T element)
where T : ICloneable
{
for (int i = 0; i < count; i++)
list.Add(element);
}
public static void Fill(this List> list, int count, List element)
{
for (int i = 0; i < count; i++)
list.Add(element.Clone());
}
public static void Set(this List list, int index, T element)
{
List backup = list.Clone();
list.Clear();
for (int i = 0; i < list.Count; i++) list.Add(i == index ? element : list[i]);
}
}