代码之家  ›  专栏  ›  技术社区  ›  DigitalZebra

NET等价于Java的TeSEet操作尾集和头戴式耳机?

  •  0
  • DigitalZebra  · 技术社区  · 15 年前

    我正在尝试使用.NET 4 SortedSet<T> 收藏。它似乎有我所需要的一切减去一些东西。

    Q :我希望能够获取与给定值相比更低或更高的所有元素。在Java中 TreeSet ,有个方法名为 tailSet headSet 执行这些操作。我想也能这样做 排序集<t> . 我能找到的最接近的是 GetViewBetween . 但是,如果我想使用Sortedset string ?没有最大值 一串 我知道,但是我需要给这个方法一个上下界。

    我怎么能模仿 尾座 头戴式耳机 使用 SortedSet ?考虑实施 排序集 我认为这些方法很容易实现。

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  2
  •   Gabe Timothy Khouri    15 年前

    我相信你可以像这样模仿他们: 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)) 以获得克隆行为。

        2
  •  1
  •   Édgar Sánchez Gordón    15 年前

    我认为一点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);
    
    推荐文章