我正在尝试使用 .NET 4 的 SortedSet<T>
Collection 。它似乎拥有我需要的一切,除了一些东西。
问:我希望能够获取与给定值相比更低或更高的所有元素。在Java中TreeSet
,有名为 tailSet
的方法和headSet
,执行这些操作。我希望能够对 SortedSet<T>
执行同样的操作。我能找到的最接近的是 GetViewBetween
。但是,如果我想将 SortedSet 与 string
一起使用怎么办? ? string
没有最大值据我所知,但我需要给该方法一个上限和下限。
我如何模仿 tailSet
的行为和headSet
使用SortedSet
?考虑实现SortedSet
,我认为这些都是非常容易实现的方法。
谢谢!
最佳答案
我相信你可以像这样模仿他们:
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
为您提供一个带有指向原始集的指针的对象,因此原始集中的任何更改都可以反射(reflect)在副本中。 LINQ 版本根据原始内容创建一个新集,并提供不相互跟踪的副本。当然,你也可以这样做 new SortedSet<T>(set.GetViewBetween(set.Min, end))
获得克隆行为。
关于java - .NET相当于Java的TreeSet操作tailSet和headSet吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4007099/