在 C# 中比较数组的有效方法

Posted

技术标签:

【中文标题】在 C# 中比较数组的有效方法【英文标题】:Efficient way to compare arrays in C# 【发布时间】:2021-10-16 05:13:00 【问题描述】:

我有 10 个布尔数组,我需要找到一种方法来检查两个或更多是否匹配。

示例(为了简单起见,仅使用 3 个数组):

array1[0]=false   array2[0]=true   array3[0]=false     => less than 2 are true
array1[1]=true    array2[1]=true   array3[1]=true      => 2 or more are true

提前致谢:D

【问题讨论】:

您是否只想计算跨多个数组的每个索引位置有多少“真”? 如果所有数组的大小都相同,并且您需要知道每个索引是否匹配,那么您能做的最好的事情就是 O(N)。有一个外部循环,然后在找到true 的两个值后检查短路的每个索引。另一种选择是跟踪每个数组的true 值。存储一些数据结构,很可能是Dictionary,它将键存储为索引,将值存储为计数。每当一个新的布尔值设置为真时,增加该索引。每当 bool 设置为 false 时,减少该索引。如果你想要一个例子,我可以添加一个。 您不应使用多个布尔数组,而应使用一个数值数组。不是分配真值和假值,而是为真值递增。然后,您会立即获得大于或等于 2 的计数器。 【参考方案1】:

如果你想在数组的每个索引处计算trues,我建议将数组组织成一个集合(让它成为arrays):

  bool[] array1 = new bool[]  false, true;
  bool[] array2 = new bool[]  true, true ;
  bool[] array3 = new bool[]  false, true ;

  ...

  // Add as many arrays as required
  var arrays = new bool[][] 
   array1,
   array2,
   array3,
 ;

那么你可以在 Linq 的帮助下查询这个arrays

 using System.Linq;

 ...

 int[] trueCounts = Enumerable
   .Range(0, arrays.Max(array => array.Length))
   .Select(i => arrays.Count(array => i < array.Length && array[i]))
   .ToArray(); 

 // Let's have a look:
 Console.Write(string.Join(Environment.NewLine, trueCounts));

结果:

 1
 3

您可以自定义输出:

 string result = string.Join(Environment.NewLine, trueCounts
   .Select(c => $"(c < 2 ? "less than 2 are true" : "2 or more are true")"));

 Console.Write(result);

结果:

 less than 2 are true 
 2 or more are true

【讨论】:

以上是关于在 C# 中比较数组的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

没有绑定检查的 C# byte[] 比较

比较两个数组的有效方法

基于嵌套列表中包含的 id 元素比较两个通用列表的最有效方法 (C#)

在 C# 中存储和比较目录的最有效数据结构是啥?

在 D 语言中比较两个内存块的最有效方法是啥?

比较数组 c#