【问题标题】:Efficient conversion of HashSet list to a single HashSet将 HashSet 列表高效转换为单个 HashSet
【发布时间】:2018-12-07 02:08:39
【问题描述】:

我想知道将IEnumerable<HashSet<T>> 转换为单个Hashset<T> 及其所有元素的最有效(编辑:最快)方法是什么。

示例情况:

提供:

    class Rectangle
    {
        public HashSet<Point> PointSet { get; set; }
    }

高效实施:

    HashSet<Point> ExtractUniquePoints(IEnumerable<Rectangle> rectangles) {}

低效解决方案:

    HashSet<Point> ExtractUniquePoints(IEnumerable<Rectangle> rectangles)
    {
        HashSet<Point> uniquePoints = new HashSet<Point>();

        foreach (Rectangle rectangle in rectangles)
        {
            foreach (Point point in rectangle.PointSet)
            {
                uniquePoints.Add(point);
            }
        }

        return uniquePoints;
    }

提前致谢!

【问题讨论】:

  • “最高效”是什么意思?代码少?更快的代码?内存少? GC 更少?
  • 我发布了一个答案,但我再次阅读了你的问题,现在我很困惑,所以我删除了我的答案。您的问题似乎比简单地将一组 HashSet 组合成一个 HashSet 更复杂,对吗?你实际上需要一些逻辑,对吧?
  • 你真的有性能瓶颈吗?
  • @Enigmativity 我的意思是更快,已编辑。
  • 不太可能显着改进您在帖子中的代码,因为您已经在每个点上执行过一次并使用foreach 而不是 LINQ...如果您认为您的代码中有特定的部分表现不佳并且有一些理由让它更快 - 将其添加到您的帖子中。我认为真正的变化必须高于整体算法,这应该是单独的问题(甚至可能是 CS 或 SoftwareEngineering SE 网站)

标签: c# algorithm hashset


【解决方案1】:

我认为不一定有更快的方法来做你正在做的事情(至少不是使用 HashSets),但更短的方法如下:

HashSet<Point> ExtractUniquePoints(IEnumerable<Rectangle> rectangles)
{
    return new HashSet<Point>(rectangles.SelectMany(r => r.PointSet));
}

或者,如果您使用的是 .NET Core,只需:

HashSet<Point> ExtractUniquePoints(IEnumerable<Rectangle> rectangles)
{
    return rectangles.SelectMany(r => r.PointSet).ToHashSet();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2021-07-14
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多