获取在同一索引中相同的元素数

本文关键字:元素 索引 获取 | 更新日期: 2023-09-27 18:22:39

我有两个数组(都是相同的长度),我试图迭代两个数组中的每个元素,并测试这些元素(具有相同索引)是否相等。我想得到相等的数和不相等的数。我已经能够使用while循环来完成这项工作,但我想知道System.Linq扩展是否有更快的方法?

以下是我现在拥有的:

    var list1 = new List<Color>
        {
            Color.Aqua,
            Color.AliceBlue,
            Color.Beige,
            Color.Red,
            Color.Green,
            Color.White
        };

        var list2 = new List<Color>
        {
            Color.Red,
            Color.BurlyWood,
            Color.Beige,
            Color.Azure,
            Color.Green,
            Color.Magenta
        };
        var enumFirst = list1.GetEnumerator();
        var enumSecond = list2.GetEnumerator();
        var equal = 0;
        var notEqual = 0;
        while (enumFirst.MoveNext() && enumSecond.MoveNext())
        {
            var colorFirst = enumFirst.Current;
            var colorSecond = enumSecond.Current;
            if (colorFirst == colorSecond)
                equal++;
            else
                notEqual++;
        }
        Console.WriteLine("Elements that are equal: " + equal);
        Console.WriteLine("Elements that are not equal: " + notEqual); 

输出为:

Elements that are equal: 2
Elements that are not equal: 4

获取在同一索引中相同的元素数

是,使用Zip

var equal = list1.Zip(list2, (l1, l2) => l1 == l2).Count(x => x);
var notEqual = list1.Count() - equal;

如果其中一个列表没有更多的元素可枚举(列表有不同数量的元素),Zip将跳过所有剩余元素:

如果输入序列的元素数量不相同,则该方法会组合元素,直到到达其中一个序列的末尾。

也许不会更快,但肯定只有一行:

var areequal = list1.Select((x, i) => list2[i] == x);
var equals = areequal.Count(x => x);
var notequals = areequal.Count(x => !x);

使用Select可以选择元素是否相等,然后使用count对每组进行计数。只有当列表2的大小至少与列表1的大小相同(但有问题的是,请注意列表的大小相同)时,此方法才会起作用

但如果在某些情况下,这些列表的大小不同,请将第一行更改为:

var areequal = list1.Take(Math.Min(list2.Count, list.Count))
                                                      .Select((x, i) => list2[i] == x);

Take将确保来自list1的所有已处理元素的大小与list2的大小相同。