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