Я полагаю, что вы можете подражать им следующим образом: sortedSet.GetViewBetween(start, sortedSet.Max)
sortedSet.GetViewBetween(sortedSet.Min, end)
static SortedSet<T> TailSet<T>(this SortedSet<T> set, T start)
{
return set.GetViewBetween(start, set.Max);
}
static SortedSet<T> HeadSet<T>(this SortedSet<T> set, T end)
{
return set.GetViewBetween(set.Min, end);
}
Альтернативно, вы можете использовать LINQ:
static SortedSet<T> TailSet<T>(this SortedSet<T> set, T start)
{
return new SortedSet<T>(set.SkipWhile(
x => set.Comparer.Compare(x, start) < 0));
}
static SortedSet<T> HeadSet<T>(this SortedSet<T> set, T end)
{
return new SortedSet<T>(set.TakeWhile(
x => set.Comparer.Compare(x, end) < 0));
}
Основное отличие состоит в том, что GetViewBetween
дает вам объект с указателем на исходный набор, поэтому любые изменения в исходном наборе могут быть отражены в копиях.Версия LINQ создает новый набор на основе содержимого оригинала, предоставляя копии, которые не отслеживают друг друга.Конечно, вы также можете сделать что-то вроде new SortedSet<T>(set.GetViewBetween(set.Min, end))
, чтобы получить поведение клонирования.