.NET相当于Java的TreeSet操作tailSet和headSet?

时间:2010-10-24 03:49:59

标签: java .net collections

我正在尝试使用.NET 4的SortedSet<T>集合。它似乎有我需要的一切减去几件事。

:我希望能够获取与给定值相比更低或更高的所有元素。在Java的TreeSet中,有一些名为tailSetheadSet的方法,它们执行这些操作。我希望能够对SortedSet<T>做同样的事情。我能找到的最近的是GetViewBetween。但是,如果我想将SortedSet与string一起使用,该怎么办?我知道没有string的最大值,但我需要给方法一个上限和下限。

我如何使用tailSet模仿headSetSortedSet的行为?考虑到SortedSet的实现,我认为这些是非常容易实现的方法。

谢谢!

2 个答案:

答案 0 :(得分:2)

我相信你可以像这样模仿他们: 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 :(得分:1)

我认为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);