【问题标题】:How to check if an array contains any item of another array如何检查一个数组是否包含另一个数组的任何项
【发布时间】:2011-01-16 23:37:49
【问题描述】:

给定 2 个 int 数组,例如 foobar,检查数组 bar 是否包含 foo 包含的至少一项的最有效方法是什么。应该返回真/假。

我怀疑嵌套了foreach,但只是想知道是否有更好的方法?

【问题讨论】:

  • 这是作业吗?数组是任意大的,还是小于 100 个元素?除了蛮力 foreach 之外,您是否尝试过其他任何方法?
  • 不,这不是家庭作业!...只是想可能有一个不错的方法。

标签: c# arrays


【解决方案1】:

使用 LINQ:

array1.Intersect(array2).Any()

注意:使用Any() 可确保在找到第一个相等对象时停止交集算法。

【讨论】:

  • 使用 Any() 可确保在找到第一个相等对象时停止交集算法。
  • 请记住,所有 array1 都是枚举的,所以如果可能的话,您可能希望较短的数组作为 array1
  • 我从未听说过 Intersect 方法,所以我不得不查找它的作用:msdn.microsoft.com/en-us/library/bb460136.aspx 它基本上为您提供了在两个比较数组中找到的项目列表。使用 any 运算符,您可以知道在这种情况下 array1 和 array2 是否有任何相同的字符串。
【解决方案2】:

C#3:

bool result = bar.Any(el => foo.Contains(el));

C#4 并行执行:

bool result = bar.AsParallel().Any(el => foo.AsParallel().Contains(el));

【讨论】:

  • 在我的例子中 foo 是 el 的子字符串。所以,bool result = bar.Any(el => foo.Contains(el)); 不会给出所需的结果。有什么建议如何实现这个查询?
  • 在这种情况下使用Any()Contains() 比其他方式更快;)。
【解决方案3】:

是的嵌套循环,虽然有一个是隐藏的:

bool AnyAny(int[] A, int[]B)
{
    foreach(int i in A)
       if (B.Any(b=> b == i))
           return true;
    return false;
}

【讨论】:

    【解决方案4】:

    另一种解决方案:

    var result = array1.Any(l2 => array2.Contains(l2)) == true ? "its there": "not there";
    

    如果您有类而不是 int 等内置数据类型,则需要为您的类重写 Override EqualsGetHashCode 实现。

    【讨论】:

      【解决方案5】:
      static void Main(string[] args)
      
      
          int[] arr1 = { 16, 48, 40, 32, 5, 7 };
          int[] arr2 = { 48, 32, 16, 40, 56, 72, 16, 16, 16, 16, 16, 5, 7, 6, 56 };
          int k = 0;
          for (int i = 0; i < arr1.Length; i++)
          {
      
              for (int j = 0; j < arr2.Length; j++)
              {
      
                  if (arr1[i] == arr2[j])
                  {
                      k++;
                      break;
                  }
      
              }
      
          }
          if (arr1.Length == k)
          {
              Console.WriteLine(true);
          }
          else
              Console.WriteLine(false);
      }
      ----
      

      【讨论】:

      • 如果没有进一步的解释,发布似乎对一个案例非常专业的代码并不是很有帮助。
      • 见“Explaining entirely code-based answers”。虽然这在技术上可能是正确的,但它并没有解释为什么它可以解决问题或应该是选择的答案。我们应该在帮助解决问题的同时进行教育。
      【解决方案6】:

      对于一次性随机数组方法,您的方法似乎是最快的。如果一个或两个矩阵都已排序,它们的上限/下限是已知的,或者其中一个矩阵比另一个矩阵更改得更少并且您执行许多检查,则有一些方法可以提高效率。问题是您可以准备各种散列、索引和提示,将搜索优化到几乎没有,但单独建立索引的过程通常需要不止一次搜索。

      【讨论】:

      • 好点,但不清楚您在与谁交谈,如果您包含一些与 OP q 或特定答案直接相关的代码会很有帮助。
      • @G.Stoynev:我正在与提问者交谈,我相信答案应该是什么,我怀疑嵌套的“foreach”比较是否足够复杂,无法发布“一些代码” - 除非 OP 用我提到的“特殊条件”之一来限定问题,否则没有必要猜测哪个是适用的 - 对于对两个数组进行单次检查的一般条件,我们对嵌套 foreach 一无所知是最好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2022-01-09
      • 2021-05-15
      • 2023-03-24
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多