feat: Adding BinarySearch extension method for ILists

This commit is contained in:
Chris Cameron
2019-09-13 16:35:38 -04:00
parent e65578584a
commit aa17f29305

View File

@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ICD.Common.Properties;
using ICD.Common.Utils.Comparers;
@@ -18,7 +17,7 @@ namespace ICD.Common.Utils.Extensions
/// <param name="extends"></param>
/// <param name="items"></param>
[PublicAPI]
public static void AddSorted<T>(this List<T> extends, IEnumerable<T> items)
public static void AddSorted<T>(this IList<T> extends, IEnumerable<T> items)
{
if (extends == null)
throw new ArgumentNullException("extends");
@@ -37,7 +36,7 @@ namespace ICD.Common.Utils.Extensions
/// <param name="items"></param>
/// <param name="comparer"></param>
[PublicAPI]
public static void AddSorted<T>(this List<T> extends, IEnumerable<T> items, IComparer<T> comparer)
public static void AddSorted<T>(this IList<T> extends, IEnumerable<T> items, IComparer<T> comparer)
{
if (extends == null)
throw new ArgumentNullException("extends");
@@ -60,7 +59,7 @@ namespace ICD.Common.Utils.Extensions
/// <param name="items"></param>
/// <param name="predicate"></param>
[PublicAPI]
public static void AddSorted<T, TProp>(this List<T> extends, IEnumerable<T> items, Func<T, TProp> predicate)
public static void AddSorted<T, TProp>(this IList<T> extends, IEnumerable<T> items, Func<T, TProp> predicate)
{
if (extends == null)
throw new ArgumentNullException("extends");
@@ -82,7 +81,7 @@ namespace ICD.Common.Utils.Extensions
/// <param name="extends"></param>
/// <param name="item"></param>
[PublicAPI]
public static int AddSorted<T>(this List<T> extends, T item)
public static int AddSorted<T>(this IList<T> extends, T item)
{
if (extends == null)
throw new ArgumentNullException("extends");
@@ -98,7 +97,7 @@ namespace ICD.Common.Utils.Extensions
/// <param name="item"></param>
/// <param name="comparer"></param>
[PublicAPI]
public static int AddSorted<T>(this List<T> extends, T item, IComparer<T> comparer)
public static int AddSorted<T>(this IList<T> extends, T item, IComparer<T> comparer)
{
if (extends == null)
throw new ArgumentNullException("extends");
@@ -124,7 +123,7 @@ namespace ICD.Common.Utils.Extensions
/// <param name="item"></param>
/// <param name="predicate"></param>
[PublicAPI]
public static int AddSorted<T, TProp>(this List<T> extends, T item, Func<T, TProp> predicate)
public static int AddSorted<T, TProp>(this IList<T> extends, T item, Func<T, TProp> predicate)
{
if (extends == null)
throw new ArgumentNullException("extends");
@@ -143,7 +142,7 @@ namespace ICD.Common.Utils.Extensions
/// <param name="extends"></param>
/// <param name="totalLength"></param>
[PublicAPI]
public static void PadRight<T>(this List<T> extends, int totalLength)
public static void PadRight<T>(this IList<T> extends, int totalLength)
{
if (extends == null)
throw new ArgumentNullException("extends");
@@ -162,7 +161,7 @@ namespace ICD.Common.Utils.Extensions
/// <param name="totalLength"></param>
/// <param name="item"></param>
[PublicAPI]
public static void PadRight<T>(this List<T> extends, int totalLength, T item)
public static void PadRight<T>(this IList<T> extends, int totalLength, T item)
{
if (extends == null)
throw new ArgumentNullException("extends");
@@ -171,10 +170,45 @@ namespace ICD.Common.Utils.Extensions
throw new ArgumentOutOfRangeException("totalLength", "totalLength must be greater or equal to 0");
int pad = totalLength - extends.Count;
if (pad <= 0)
return;
for (int index = 0; index < pad; index++)
extends.Add(item);
}
extends.AddRange(Enumerable.Repeat(item, pad));
/// <summary>
/// Returns the index of the item in the list.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="extends"></param>
/// <param name="item"></param>
/// <param name="comparer"></param>
/// <returns></returns>
[PublicAPI]
public static int BinarySearch<T>(this IList<T> extends, T item, IComparer<T> comparer)
{
if (extends == null)
throw new ArgumentNullException("extends");
if (comparer == null)
throw new ArgumentNullException("comparer");
int lo = 0;
int hi = extends.Count - 1;
while (lo <= hi)
{
int i = lo + ((hi - lo) >> 1);
int order = comparer.Compare(extends[i], item);
if (order == 0)
return i;
if (order < 0)
lo = i + 1;
else
hi = i - 1;
}
return ~lo;
}
}
}