在Java中,arrays .equals()允许轻松地比较两个基本数组的内容(重载可用于所有基本类型)。
c#中有这样的东西吗?在c#中是否存在比较两个数组内容的“神奇”方法?
在Java中,arrays .equals()允许轻松地比较两个基本数组的内容(重载可用于所有基本类型)。
c#中有这样的东西吗?在c#中是否存在比较两个数组内容的“神奇”方法?
当前回答
列表模式是在c# 11 . net 7 RC2中添加的。
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers is [1, 2, 3]); // True
Console.WriteLine(numbers is [1, 2, 4]); // False
其他回答
这个LINQ解决方案是有效的,不知道它在性能上如何与SequenceEquals相比。但是它处理不同的数组长度,. all将在不遍历整个数组的情况下,在第一个不相等的项上退出。
private static bool arraysEqual<T>(IList<T> arr1, IList<T> arr2)
=>
ReferenceEquals(arr1, arr2) || (
arr1 != null && arr2 != null &&
arr1.Count == arr2.Count &&
arr1.Select((a, i) => arr2[i].Equals(a)).All(i => i)
);
Elementwise比较?是什么
public void Linq78a()
{
int[] numbers1 = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
bool bb = numbers.Zip(numbers1, (a, b) => (a == b)).Any(p => !p);
if (!bb) Console.WriteLine("Lists are equal (bb)");
else Console.WriteLine("Lists are not equal (bb)");
}
将(a==b)条件替换为您想在a和b中进行比较的任何内容。
(这结合了来自MSDN开发者Linq的两个例子)
也可以使用array1.ToList()。All(x => array2.Contains(x))如果您需要比较顺序不相同的数组
假设数组相等意味着两个数组在相等的下标处有相等的元素,则有SequenceEqual答案和IStructuralEquatable答案。
但两者在性能方面都有缺点。
当数组长度不同时,. net Framework中的SequenceEqual实现将不会进行快捷操作,因此它可能会完全枚举其中一个数组,并比较其中的每个元素。 这就是说,取决于。net风格(比如。net 5),它可能会有快捷方式,请看这条评论。因此,对于一个最新的。net项目,SequenceEqual应该是一个不错的选择。
IStructuralEquatable不是通用的,可能会导致每个比较值的装箱。此外,它使用起来不是很简单,并且已经调用了一些helper方法来隐藏它。
从性能角度来看,使用如下代码可能会更好:
bool ArrayEquals<T>(T[] first, T[] second)
{
if (first == second)
return true;
if (first == null || second == null)
return false;
if (first.Length != second.Length)
return false;
for (var i = 0; i < first.Length; i++)
{
if (!first[i].Equals(second[i]))
return false;
}
return true;
}
当然,这也不是检查数组是否相等的“神奇方法”。
所以目前,不,在。net中并没有真正等价于Java Arrays.equals()的东西。
你可以使用Enumerable.SequenceEqual。这适用于任何IEnumerable<T>,而不仅仅是数组。