.NET эквивалент операций Java TreeSet tailSet и headSet? - PullRequest
0 голосов
/ 24 октября 2010

Я пытаюсь использовать коллекцию .NET 4 SortedSet<T>.Кажется, есть все, что мне нужно, за исключением нескольких вещей.

Q : я хочу иметь возможность выбирать все элементы ниже или выше по сравнению с заданным значением.В Java TreeSet есть методы с именами tailSet и headSet, которые выполняют эти операции.Я хотел бы иметь возможность сделать то же самое с SortedSet<T>.Ближайшее, что я могу найти, это GetViewBetween.Однако что если я захочу использовать SortedSet с string?Не существует максимального значения string, о котором я знаю, но мне нужно дать методу верхнюю и нижнюю границы.

Как можно имитировать поведение tailSet и headSet, используя SortedSet?Учитывая реализацию SortedSet, я думаю, что это будет очень простой способ реализации.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 октября 2010

Я полагаю, что вы можете подражать им следующим образом: 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)), чтобы получить поведение клонирования.

1 голос
/ 24 октября 2010

Я думаю, что небольшое LINQ может решить проблему:

        var sortedSet = new SortedSet<string>();
        sortedSet.Add("Santiago");
        sortedSet.Add("Alejandra");
        sortedSet.Add("Carolina");
        sortedSet.Add("Sebastián");

        var head = sortedSet.Where(s => string.Compare(s, "Carolina") < 0);
        var tail = sortedSet.Where(s => string.Compare(s, "Carolina") >= 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...