我正在尝试使用.NET 4的SortedSet<T>
集合。它似乎有我需要的一切减去几件事。
问:我希望能够获取与给定值相比更低或更高的所有元素。在Java的TreeSet
中,有一些名为tailSet
和headSet
的方法,它们执行这些操作。我希望能够对SortedSet<T>
做同样的事情。我能找到的最近的是GetViewBetween
。但是,如果我想将SortedSet与string
一起使用,该怎么办?我知道没有string
的最大值,但我需要给方法一个上限和下限。
我如何使用tailSet
模仿headSet
和SortedSet
的行为?考虑到SortedSet
的实现,我认为这些是非常容易实现的方法。
谢谢!
答案 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);