在 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】:
如果你想在数组的每个索引处计算true
s,我建议将数组组织成一个集合(让它成为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# 中比较数组的有效方法的主要内容,如果未能解决你的问题,请参考以下文章