最简单的方法来比较C#中的数组
在Java中, Arrays.equals()允许轻松地比较两个基本数组的内容(重载可用于所有基本types)。
C#中有这样的事情吗? 有没有比较C#中的两个数组的内容的“魔术”方式?
你可以使用SequenceEqual 。 这适用于任何IEnumerable<T>
,而不仅仅是数组。
在LINQ中使用SequenceEqual。
int[] arr1 = new int[] { 1,2,3}; int[] arr2 = new int[] { 3,2,1 }; Console.WriteLine(arr1.SequenceEqual(arr2)); // false Console.WriteLine(arr1.Reverse().SequenceEqual(arr2)); // true
对于数组(和元组),您也可以使用.NET 4.0的新接口: IStructuralComparable和IStructuralEquatable 。 使用它们不仅可以检查数组的相等性,还可以比较它们。
static class StructuralExtensions { public static bool StructuralEquals<T>(this T a, T b) where T : IStructuralEquatable { return a.Equals(b, StructuralComparisons.StructuralEqualityComparer); } public static int StructuralCompare<T>(this T a, T b) where T : IStructuralComparable { return a.CompareTo(b, StructuralComparisons.StructuralComparer); } } { var a = new[] { 1, 2, 3 }; var b = new[] { 1, 2, 3 }; Console.WriteLine(a.Equals(b)); // False Console.WriteLine(a.StructuralEquals(b)); // True } { var a = new[] { 1, 3, 3 }; var b = new[] { 1, 2, 3 }; Console.WriteLine(a.StructuralCompare(b)); // 1 }
对于.NET 4.0及更高版本,可以使用StructuralComparisonstypes比较数组或元组中的元素:
object[] a1 = { "string", 123, true }; object[] a2 = { "string", 123, true }; Console.WriteLine (a1 == a2); // False (because arrays is reference types) Console.WriteLine (a1.Equals (a2)); // False (because arrays is reference types) IStructuralEquatable se1 = a1; //Next returns True Console.WriteLine (se1.Equals (a2, StructuralComparisons.StructuralEqualityComparer));
SequenceEqual
只会在两个条件满足的情况下返回true。
- 它们包含相同的元素。
- 元素的顺序是相同的。
如果你只想检查它们是否包含相同的元素,而不pipe它们的顺序和你的问题的types
values2是否包含values1中包含的所有值?
你可以使用LINQ扩展方法Enumerable.Except
,然后检查结果是否有任何值。 这是一个例子
int[] values1 = { 1, 2, 3, 4 }; int[] values2 = { 1, 2, 5 }; var result = values1.Except(values2); if(result.Count()==0) { //They are the same } else { //They are different }
而且通过使用这个,你也可以自动获得不同的项目。 一石二鸟。
请记住,如果你这样执行你的代码
var result = values2.Except(values1);
你会得到不同的结果。
在我的情况下,我有一个数组的本地副本,并希望检查是否有任何东西已经从原始数组中删除,所以我使用这种方法。
对于unit testing,可以使用CollectionAssert.AreEqual
而不是Assert.AreEqual
。
这可能是最简单的方法。
元素比较? 关于什么
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中比较的任何东西来replace(a == b)条件。
(这个例子结合了MSDN开发者Linq的两个例子)
对于某些应用可能会更好:
string.Join("", arr1) == string.Join("", arr2)
这是一个奇怪的实现。
static bool ArraysEqual<T>(T[] a, T[] b) { int k = 0; return a.All(x => x.Equals(b[k++])); }
我在视觉工作室做了这个,它完美的工作。 比较数组索引与简短的代码。
private void compareButton_Click(object sender, EventArgs e) { int[] answer = { 1, 3, 4, 6, 8, 9, 5, 4, 0, 6 }; int[] exam = { 1, 2, 3, 6, 8, 9, 5, 4, 0, 7 }; int correctAnswers = 0; int wrongAnswers = 0; for (int index = 0; index < answer.Length; index++) { if (answer[index] == exam[index]) { correctAnswers += 1; } else { wrongAnswers += 1; } } outputLabel.Text = ("The matching numbers are " + correctAnswers + "\n" + "The non matching numbers are " + wrongAnswers); }
输出将是; 匹配的数字是7不匹配的数字是3
如果您想要优雅地处理null
input,并忽略项目的顺序,请尝试以下解决scheme:
static class Extensions { public static bool ItemsEqual<TSource>(this TSource[] array1, TSource[] array2) { if (array1 == null && array2 == null) return true; if (array1 == null || array2 == null) return false; return array1.Count() == array2.Count() && !array1.Except(array2).Any(); } }
testing代码如下所示:
class Program { static void Main(string[] args) { int[] a1 = new int[] { 1, 2, 3 }; int[] a2 = new int[] { 3, 2, 1 }; int[] a3 = new int[] { 1, 3 }; int[] a4 = null; int[] a5 = null; int[] a6 = new int[0]; Console.WriteLine(a1.ItemsEqual(a2)); // Output: True. Console.WriteLine(a2.ItemsEqual(a3)); // Output: False. Console.WriteLine(a4.ItemsEqual(a5)); // Output: True. No Exception. Console.WriteLine(a4.ItemsEqual(a3)); // Output: False. No Exception. Console.WriteLine(a5.ItemsEqual(a6)); // Output: False. No Exception. } }