获取相同索引处相同元素数量

4
我有两个数组(长度相同),我尝试遍历两个数组中的每个元素,并测试这些具有相同索引的元素是否相等。我想要得到相等和不相等的数量。我已经使用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
2个回答

7

是的,使用 Zip

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

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

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


2
也许不是更快,但绝对是一行代码解决的:
var areequal = list1.Select((x, i) => list2[i] == x);
var equals = areequal.Count(x => x);
var notequals = areequal.Count(x => !x);

使用 Select,您可以选择元素是否相等,然后通过使用计数器,计算每个组的数量。这种方法仅在list2至少与list1相同大小时才适用(但问题中指出列表大小相同)。

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

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

Take 会确保从 list1 处理的所有元素大小与 list2 相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接