【问题标题】:Remove elements from one Hashset where NOT in another Hashset?从一个 Hashset 中删除不在另一个 Hashset 中的元素?
【发布时间】:2015-11-16 07:12:22
【问题描述】:

我知道hashsetA.Except(hashsetB) 会从hashsetA 中删除hashsetB 中存在的元素。但是,我想从 hashsetA 中删除 存在于 hashsetB 中的元素。

目前我只是将hashsetA 复制到一个新的Hashset 然后使用ExceptWith() 两次:

hashsetC = new HashSet<var>(hashsetA);
hashsetC.ExceptWith(hashsetB);
hashsetA.ExceptWith(hashsetC);

它的性能对于我的目的来说已经足够好了,但我想知道是否有一种内置方法可以让它更快/更简洁? 还是我错过了从集合中选择的明显方法?

【问题讨论】:

    标签: c# hashset


    【解决方案1】:

    只需使用IntersectWith method

    hashsetA.IntersectWith(hashsetB);
    

    【讨论】:

    • 这太完美了,谢谢!我的集合论显然很生疏,无法在需要时发现相交!
    【解决方案2】:
    res = hashsetA.Where(p=> hashsetB.Contains(p)). 
    

    假设在 Hashset 中的查找是 O(1),那么总和应该是 O(n)。

    【讨论】:

    • 它创建了res,但我认为提问者想要修改hashsetA。您没有解释如何实现这一目标。执行new HashSet&lt;var&gt;(res) 将给出另一组,但不会修改hashsetA。然后hashsetA = new HashSet&lt;var&gt;(res) 其中res 来自您的答案可能会有所帮助,但如果其他人引用了HashSet&lt;&gt; 的原始实例,则不会。
    • @JeppeStigNielsen 是的,我同意,如果有必要修改现有的哈希集,那么您的解决方案是正确的 :)
    • 如果你想在不改变源的情况下使用Linq对集合进行“过滤”,也可以使用res = hashsetA.Intersect(hashsetB);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多