代码之家  ›  专栏  ›  技术社区  ›  Bryan Watts

使用linq[重复]确定序列是否包含其他序列的所有元素

  •  97
  • Bryan Watts  · 技术社区  · 16 年前

    这个问题已经有了答案:

    给定两组值:

    var subset = new[] { 2, 4, 6, 8 };
    
    var superset = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    

    我如何确定 superset 包含的所有元素 subset ?

    我想到了这个:

    superset.Intersect(subset).Count() == subset.Count()
    

    这是最合乎逻辑和最有效的方法吗?

    4 回复  |  直到 16 年前
        1
  •  155
  •   Amy B    16 年前

    伯爵?没有怎么样?

    bool contained = !subset.Except(superset).Any();
    
        2
  •  28
  •   Amy B    16 年前

    所以,我的另一个答案很容易使用。但这是一个O(N*M)解决方案。

    这里有一个稍微不友好的O(N+M)解决方案。如果超集很大,就应该使用这个。它避免重复枚举超集。

    HashSet<int> hashSet = new HashSet<int>(superset);
    bool contained = subset.All(i => hashSet.Contains(i));
    
        3
  •  12
  •   Anders    13 年前

    我有一个扩展方法,它使用现有的contains()-方法。我发现它比使用instersect()或except()更直观。

    public static bool ContainsAll<T>(this IEnumerable<T> source, IEnumerable<T> values)
    {
        return values.All(value => source.Contains(value));
    }
    
        4
  •  4
  •   leppie    16 年前

    可以使用except,结果计数应为0。

    有关参数的详细信息,请参阅msdn。

    例子:

    subset.Except(superset).Count() == 0