【问题标题】:Is there a Linq method to tell that A is the subset of B? [duplicate]有没有一种 Linq 方法可以告诉 A 是 B 的子集? [复制]
【发布时间】:2023-03-13 22:08:01
【问题描述】:

让我有 2 个数组 string[] A = { "a", "b", "c" }string[] B = { "a", "b", "c", "d", "e" }

有没有什么方法可以直接判断 A 是 B 的 子集?除了只会删除 B 的不同元素,但不会判断它是否完全是 B 的子集。

感谢您的帮助。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    甚至还有一种方法可以达到这个目的。你可以使用HastSet<T>.IsSubsetOf:

    var aSet = new HashSet<string>(A);
    bool isASubsetOfB = aSet.IsSubsetOf(B);
    

    【讨论】:

    • 这不是 LINQ。但也许它比使用 linq 更有效。
    • @DeCaf:如果已经有可读且高效的方法,为什么还要使用 LINQ?
    • 除了问题询问是否有 Linq 方法之外,没有其他原因。
    • @DeCaf:我猜 OP 只是认为没有任何内置功能。我也非常喜欢 LINQ,因为它可以提高可读性,但有时可用的方法更具可读性和效率。基本上 LINQ 也只是位于 System.Linq 命名空间中的类中的方法。
    • 这可能会比我的效率稍高一些。 Except 只是在幕后构建了一个哈希集。
    【解决方案2】:

    这应该可以工作

    bool isSubSet = !A.Except(B).Any();
    

    【讨论】:

    • 应该为了可读性而否定它,不是吗?对于使用此代码时给出的示例,A ⊆ B 是错误的,这似乎令人困惑。
    • 在这种情况下,将其设为IsSubsetOf() 之类的扩展方法。
    • 是的,你必须添加 ! 否则你检查它是否不是一个子集,所以不是它应该做的。
    • @CoryNelson 也许,但我的意思是变量是倒退的。此代码正在检查“A 是否是 B 的超集”
    • 啊哈,现在我明白你的意思了。固定。
    【解决方案3】:

    您可以结合 SequenceEquals 和 Intersect:

    var isASubsetOfB = B.Intersect(A).SequenceEqual(A)
    

    【讨论】:

    • 确保您在使用它时真正关心订单。
    【解决方案4】:

    你可以这样做,很简单:

    A.All(B.Contains);
    

    您可能想检查Length 以确保它们的大小不同并且A 是一个子集

    bool isSubset = A.All(B.Contains) && A.Length < B.Length;
    

    【讨论】:

    • AFAIK,任何集合都是它自己的子集。
    • @Mephy 是的,只有 proper 子集才需要上述检查。
    • 这可能非常效率低下,具体取决于您的集合的大小。
    • @CoryNelson 和最不可读的发布答案 imo。
    • @brz 这对我来说是可读的......我将其读作“B 是否包含所有 A”。事实上,除了'Does'和'of'之外,那句话的所有词都在他的陈述中。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多