public static BinaryInsertResult <T> BinaryInsert <T>(this IList <T> list, T value, int index = 0, int length = int.MaxValue, IComparer <T> comparer = null, BinaryInsertStrategy insertStrategy = BinaryInsertStrategy.DoNothingIfFound)
 {
     return(BinaryInsert(list, value, k => k, index, length, comparer, insertStrategy));
 }
        public static BinaryInsertResult <T> BinaryInsert <T, TKey>(this IList <T> list, T item, Func <T, TKey> keySelector, int index = 0, int length = int.MaxValue, IComparer <TKey> comparer = null, BinaryInsertStrategy insertStrategy = BinaryInsertStrategy.DoNothingIfFound)
        {
            index = BinarySearch(list, keySelector(item), keySelector, index, length, comparer);

            if (index > -1)
            {
                switch (insertStrategy)
                {
                case BinaryInsertStrategy.DoNothingIfFound:
                    return(new BinaryInsertResult <T>(list, item, index, false));

                case BinaryInsertStrategy.InsertAfter:
                    index++;
                    break;

                case BinaryInsertStrategy.Replace:
                    list[index] = item;
                    return(new BinaryInsertResult <T>(list, item, index, true));
                }
            }
            else
            {
                index = ~index;
            }

            list.Insert(index, item);
            return(new BinaryInsertResult <T>(list, item, index, true));
        }