【问题标题】:C# List Only ContainsC# 列表仅包含
【发布时间】:2013-06-11 16:14:49
【问题描述】:

希望找出是否有一种简单的方法可以检查列表是否仅包含某些列表值。

例如,如果我有一个可能随机包含不同整数 1-10(即 1、3、7 或 2、3、4、6、8、9)的 int 列表,并且我想检查该列表是否仅包含 int 1 和/或 5。1 或 5 或 1,5 将返回 true,其他任何内容都将返回 false。

这实际上是针对 MVC 项目的,是一个字符串列表。根据条件,我构建了一个字符串列表,并希望检查 2 个特定字符串中的 1 个或两个,但列表中不存在其他字符串。

现在我获取列表并检查它是否包含 2 个字符串中的每一个,如果它们存在则删除它们。然后我可以计算列表,如果 > 0 我知道 1 或两个字符串不是列表中的唯一值。这感觉非常hackish,我认为有更好的方法来做到这一点。同样在将来,如果我的两个字符串是另一个动态的字符串列表,那么有一个简单的方法会很好,而不是必须 foreach 两个列表的每个字符串如果存在于另一个列表中,然后从一个列表中删除它们,然后我可以计算列表来获取我需要的布尔值。

希望有类似于 .Contains(T Item) 之类的东西,例如 .OnlyContains(T Item or IEnumerable) 但还没有找到类似的东西。

谢谢。

【问题讨论】:

  • 如果只检查 1 和 5,为什么列表 1、3、7 会为真?它不仅包含 1 或 5。
  • 由于您的列表仅包含不同的int,您可能希望使用SortedSet<int> 而不是List<int>。这样做的好处是“集合”有 IsSubsetOfIsSupersetOf 这样的方法。
  • 你的权利,我写的例子完全错误,现在在帖子中修复它们。

标签: c# list ienumerable contains


【解决方案1】:
if (someList.Except(desiredItems).Any())
    // Uh oh

【讨论】:

    【解决方案2】:

    如果我正确理解了这个问题,您想知道一个集合是否包含另一个集合中的任何项目。使用Enumerable.Intersect:

    var ints1 = new[] { 1, 3, 7 };
    var ints2 = new [] { 2, 3, 4, 6, 8, 9 };
    var list = new[] { 1, 5 };
    bool containsAny = ints1.Intersect(list).Any();
    Console.WriteLine(containsAny);    // True
    containsAny = ints2.Intersect(list).Any();
    Console.WriteLine(containsAny);    // False
    

    也包括此要求

    1,5 列表或没有元素的列表也将返回 true。

    只需检查集合是否包含任何元素:

    bool any = list.Any();
    

    【讨论】:

    • 对不起,可能解释得不好。考虑过相交,但我想检查列表是否仅包含相交命令将返回的值,而不仅仅是发生相交时。
    • 但是您的样本数据 + 期望的结果讲述了一个不同的故事。 "1,3,7 或 2,3,4,6,8,9,我想检查列表是否仅包含 int 1 和/或 5。在我的 2 个示例中,1,3,7 将返回 true 和 2,3,4,6,8,9 将返回 false"
    • 是的,你是对的,我把那件事搞砸了。我现在已经编辑了我的帖子,对此感到抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2012-12-05
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多