.NET 相当于 Java 的 TreeSet 操作 tailSet 和 headSet?

发布于 2024-09-28 22:49:14 字数 540 浏览 1 评论 0原文

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

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

如何使用 SortedSet 模仿 tailSetheadSet 的行为?考虑到 SortedSet 的实现,我认为这些方法非常容易实现。

谢谢!

I'm trying to use .NET 4's SortedSet<T> collection. It seems to have everything I need minus a couple things.

Q: I want to be able to fetch all elements lower or higher in comparison to a given value. In Java's TreeSet, there are methods named tailSet and headSet, which perform these operations. I'd like to be able to do the same with SortedSet<T>. The closest I can find is GetViewBetween. However, what if I wanted to use SortedSet with string? There is no max value of string that I know of, yet I need to give the method an upper and lower bounds.

How could I mimic the behavior of tailSet and headSet using SortedSet? Considering the implementation of SortedSet, I'd think that these would be very easy methods to implement.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时常饿 2024-10-05 22:49:14

我相信你可以像这样模仿他们:
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(set.GetViewBetween(set.Min, end)) 的操作来获取克隆行为。

I believe you can emulate them like this:
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);
}

Alternately, you can use 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));
}

The primary difference is that GetViewBetween gives you an object with a pointer to the original set, so any changes in the original set can be reflected in the copies. The LINQ version creates a new set based on the contents of the original, giving copies that don't track each other. Of course, you could also do something like new SortedSet<T>(set.GetViewBetween(set.Min, end)) to get the cloning behavior.

小瓶盖 2024-10-05 22:49:14

我认为一点 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);

I think a little LINQ may solve the problem:

        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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文