Я смотрел на нашу кодовую базу и нашел
public static IEnumerable<T> GetViewBetween<T>(this ImmutableSortedSet<T> set, T min, T max)
{
var index = set.IndexOf(min);
if (index < 0)
{
// No exact match found, but "larger" items are available.
index = ~index;
}
while (index < set.Count)
{
var item = set[index++];
if (set.KeyComparer.Compare(item, min) >= 0 && set.KeyComparer.Compare(item, max) <= 0)
{
yield return item;
}
else
{
break;
}
}
}
Который действительно ищет объекты между min
и max
. Однако меня интригует строковый регистр и вызов этого метода.
Предположим, у нас есть следующая структура набора (уже отсортированная) [ "esent", "event", "eventamazing", "ewent" ]
, и мы запрашиваем набор с термином "ev"
. Мне сказали, что это делает поиск по индексу, и в данном конкретном случае GetViewBetween
возвращает [ "event", "eventamazing" ]
, что именно так, как я хочу, но вызов этого метода следующий:
set.GetViewBetween(term, term + char.MaxValue).ToImmutableList();
Я всегда думал, что строки сравниваются по длине или символам по символам в зависимости от компаратора (KeyComparer
в моем случае - OrdinalIgnoreCaseComparer
), но я не могу понять, как работает объединение char.MaxValue
в этом случай