我正在尝试使用.NET 4的SortedSet<T>集合。好像有我需要的东西-几样东西。
Q:我希望能够获取与给定值相比更低或更高的所有元素。在Java的TreeSet中,有名为tailSet和headSet的方法,它们执行这些操作。我希望能够对SortedSet<T>做同样的事情。我能找到的最接近的是GetViewBetween。但是,如果我想在SortedSet中使用string怎么办?据我所知,没有string的最大值,但我需要给该方法一个上、下界。
如何使用tailSet和headSet来模拟SortedSet的行为?考虑到SortedSet的实现,我认为这些方法很容易实现。
谢谢!
发布于 2010-10-24 04:44:19
我相信你可以这样模仿他们: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))的事情来获得克隆行为。
发布于 2010-10-24 04:31:01
我认为小小的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);https://stackoverflow.com/questions/4007099
复制相似问题