.NET等价于Java';s TreeSet操作套件和耳机?

.NET等价于Java';s TreeSet操作套件和耳机?,java,.net,collections,Java,.net,Collections,我正在尝试使用.NET4的SortedSet集合。它似乎有我需要的一切,除了一些东西 Q:我希望能够获取与给定值相比更低或更高的所有元素。在Java的TreeSet中,有一些名为tailSet和headeadset的方法执行这些操作。我希望能够对SortedSet执行同样的操作。我能找到的最接近的是GetViewBetween。但是,如果我想将SortedSet与字符串一起使用,该怎么办?据我所知,string没有最大值,但我需要给这个方法一个上界和下界 如何使用SortedSet模拟尾套和耳机

我正在尝试使用.NET4的
SortedSet
集合。它似乎有我需要的一切,除了一些东西

Q:我希望能够获取与给定值相比更低或更高的所有元素。在Java的
TreeSet
中,有一些名为
tailSet
headeadset
的方法执行这些操作。我希望能够对
SortedSet
执行同样的操作。我能找到的最接近的是
GetViewBetween
。但是,如果我想将SortedSet与
字符串一起使用,该怎么办?据我所知,
string
没有最大值,但我需要给这个方法一个上界和下界

如何使用
SortedSet
模拟
尾套
耳机
的行为?考虑到
SortedSet
的实现,我认为这些将是非常容易实现的方法


谢谢

我认为一点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);
var sortedSet=new sortedSet();
分类集添加(“圣地亚哥”);
分类集添加(“Alejandra”);
分类集。添加(“卡罗莱纳”);
sortedSet.Add(“Sebastián”);
var head=sortedSet.Where(s=>string.Compare(s,“Carolina”)<0);
var tail=sortedSet.Where(s=>string.Compare(s,“Carolina”)>=0);

我认为一点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);
var sortedSet=new sortedSet();
分类集添加(“圣地亚哥”);
分类集添加(“Alejandra”);
分类集。添加(“卡罗莱纳”);
sortedSet.Add(“Sebastián”);
var head=sortedSet.Where(s=>string.Compare(s,“Carolina”)<0);
var tail=sortedSet.Where(s=>string.Compare(s,“Carolina”)>=0);

我相信你可以像这样模仿他们:
sortedSet.GetViewBetween(开始,sortedSet.Max)
sortedSet.GetViewBetween(sortedSet.Min,end)

静态分拣集尾集(此分拣集,T启动)
{
返回set.GetViewBetween(开始,set.Max);
}
静态分拣集耳机(此分拣集,T端)
{
返回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));
}
静态分拣集尾集(此分拣集,T启动)
{
返回新的分拣集(set.SkipWhile(
x=>set.Comparer.Compare(x,start)<0);
}
静态分拣集耳机(此分拣集,T端)
{
返回新的分拣集(set.TakeWhile(
x=>set.Comparer.Compare(x,end)<0);
}

主要区别在于
GetViewBetween
为您提供了一个带有指向原始集的指针的对象,因此原始集中的任何更改都可以反映在副本中。LINQ版本基于原始内容创建一个新的集合,提供彼此不跟踪的副本。当然,您也可以执行类似于
newsortedset(set.GetViewBetween(set.Min,end))
的操作来获得克隆行为。

我相信您可以像这样模拟它们:
sortedSet.GetViewBetween(开始,sortedSet.Max)
sortedSet.GetViewBetween(sortedSet.Min,end)

静态分拣集尾集(此分拣集,T启动)
{
返回set.GetViewBetween(开始,set.Max);
}
静态分拣集耳机(此分拣集,T端)
{
返回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));
}
静态分拣集尾集(此分拣集,T启动)
{
返回新的分拣集(set.SkipWhile(
x=>set.Comparer.Compare(x,start)<0);
}
静态分拣集耳机(此分拣集,T端)
{
返回新的分拣集(set.TakeWhile(
x=>set.Comparer.Compare(x,end)<0);
}

主要区别在于
GetViewBetween
为您提供了一个带有指向原始集的指针的对象,因此原始集中的任何更改都可以反映在副本中。LINQ版本基于原始内容创建一个新的集合,提供彼此不跟踪的副本。当然,您也可以执行类似于
newsortedset(set.GetViewBetween(set.Min,end))
的操作来获取克隆行为。

对于LINQ方法,您应该使用
SortedSet
比较器,而不是默认值。以防万一这个集合有一个自定义比较器。杰夫:说得对。我没有意识到,
Comparer
是一个公共属性。Linq版本会迭代排序集中的每一项,而GetViewBetween会使用内部树结构来获取范围吗?我这样问是因为GetViewBetween看起来是一个O(logn)操作,而Linq等价物是O(n)Polaris878:理论上你是正确的,但我认为GetViewBetween统计集合中的节点,所以它也是O(n)。对于Linq方法,你应该使用
SortedSet
比较器,而不是默认值。以防万一这个集合有一个自定义比较器。杰夫:说得对。我没有意识到,
Comparer
是一个公共属性。Linq版本会迭代排序集中的每一项,而GetViewBetween会使用内部树结构来获取范围吗?我这样问是因为看起来GetViewBetween将是一个O(logn)操作,而Linq等价物将是O(n)Polaris878:理论上你是正确的,但我认为GetViewBetween对集合中的节点进行计数,所以它也是O(n)。