当前位置:  开发笔记 > 编程语言 > 正文

在C#中测试数组的相等性

如何解决《在C#中测试数组的相等性》经验,为你挑选了7个好方法。

我有两个数组.例如:

int[] Array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] Array2 = new[] {9, 1, 4, 5, 2, 3, 6, 7, 8};

确定它们是否具有相同元素的最佳方法是什么?



1> 小智..:

如果SequenceEqual首先对IEnumerable对象进行排序,您也可以使用它.

int[] a1 = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };    
int[] a2 = new[] { 9, 1, 4, 5, 2, 3, 6, 7, 8 };    

bool equals = a1.OrderBy(a => a).SequenceEqual(a2.OrderBy(a => a));


是的,排序/顺序然后SequenceEqual

2> Sedat Kapano..:

通过使用LINQ,您可以表达和执行它:

var q = from a in ar1
        join b in ar2 on a equals b
        select a;

bool equals = ar1.Length == ar2.Length && q.Count() == ar1.Length;


当两个数组都具有重复值时,这不起作用.如果两个数组都包含{2,2},则连接将包含4个元素而不是2,并且表达式将为false而不是true.
我发现这比只做一个循环并比较每个项目慢得多.循环可能不是很好看,但更快,更快.

3> Marc Gravell..:

这些价值总是独一无二的吗?如果是这样,那么(检查等长后):

var set = new HashSet(array1);
bool allThere = array2.All(set.Contains);



4> eglasius..:
var shared = arr1.Intersect(arr2);
bool equals = arr1.Length == arr2.Length && shared.Count() == arr1.Length;



5> Allen..:

使用扩展方法(3.0中的新增功能).如果两个数组的交集长度等于它们的Union的长度,那么数组是相等的.

bool equals = arrayA.Intersect(arrayB).Count() == arrayA.Union(arrayB).Count()

简洁.



6> Ohad Schneid..:

对于最有效的方法(Reflectored来自微软的源代码),看到堆栈溢出问题在他们的项目顺序的平等,不论比较两个集合.



7> lukaszk..:

Framework 4.0引入了IStructuralEquatable接口,有助于比较数组或元组等类型:

 class Program
    {
        static void Main()
        {
            int[] array1 = { 1, 2, 3 };
            int[] array2 = { 1, 2, 3 };
            IStructuralEquatable structuralEquator = array1;
            Console.WriteLine(array1.Equals(array2));                                  // False
            Console.WriteLine(structuralEquator.Equals(array2, EqualityComparer.Default));  // True

            // string arrays
            string[] a1 = "a b c d e f g".Split();
            string[] a2 = "A B C D E F G".Split();
            IStructuralEquatable structuralEquator1 = a1;
            bool areEqual = structuralEquator1.Equals(a2, StringComparer.InvariantCultureIgnoreCase);

            Console.WriteLine("Arrays of strings are equal:"+  areEqual);

            //tuples
            var firstTuple = Tuple.Create(1, "aaaaa");
            var secondTuple = Tuple.Create(1, "AAAAA");
            IStructuralEquatable structuralEquator2 = firstTuple;
            bool areTuplesEqual = structuralEquator2.Equals(secondTuple, StringComparer.InvariantCultureIgnoreCase);

            Console.WriteLine("Are tuples equal:" + areTuplesEqual);
            IStructuralComparable sc1 = firstTuple;
            int comparisonResult = sc1.CompareTo(secondTuple, StringComparer.InvariantCultureIgnoreCase);
            Console.WriteLine("Tuples comarison result:" + comparisonResult);//0
        }
    } 

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有