На самом деле, в LINQ нет ничего похожего, но вы можете создавать свои собственные расширения.Этот пример позволяет передавать не фиктивный элемент, а, например, только свойство, используемое в исходном компараторе:
public static int FindFirstIndexGreaterThanOrEqualTo<TElement, TKey>(
this IList<TElement> keySortedCollection,
TKey key,
Func<TElement, TKey> keySelector,
IComparer<TKey> keyComparer)
{
int begin = 0;
int end = keySortedCollection.Count;
while (end > begin)
{
int index = (begin + end) / 2;
TElement el = keySortedCollection[index];
TKey currElKey = keySelector(el);
if (keyComparer.Compare(currElKey, key) >= 0)
end = index;
else
begin = index + 1;
}
return end;
}
public static int FindFirstIndexGreaterThanOrEqualTo<TElement, TKey>(
this IList<TElement> keySortedCollection,
TKey key,
Func<TElement, TKey> keySelector)
{
return FindFirstIndexGreaterThanOrEqualTo(keySortedCollection,
key,
keySelector,
Comparer<TKey>.Default);
}
С помощью этих методов вы можете дать сравнение, которое является подмножеством того, который вы изначальноиспользуется для сортировки коллекции.
Очевидно, что когда вы используете подмножество исходного компаратора, вы не можете быть уверены, что найдете один индекс.Таким образом, эти методы возвращают нижний предел бинарного поиска.