我有两个数组(两个长度相同),我试图迭代两个数组中的每个元素,并测试这些元素(具有相同索引)是否相等。我想得到相等的数字和不相等的数字。我已经能够使用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
答案 0 :(得分:7)
是的,请使用Zip
。
var equal = list1.Zip(list2, (l1, l2) => l1 == l2).Count(x => x);
var notEqual = list1.Count() - equal;
Zip
将跳过所有剩余元素,如果其中一个列表没有更多要枚举的元素(列表具有不同数量的元素):
如果输入序列的元素数量不同,则该方法会合并元素,直到它到达其中一个序列的末尾。
答案 1 :(得分:2)
也许不会更快,但绝对是单行的:
var areequal = list1.Select((x, i) => list2[i] == x);
var equals = areequal.Count(x => x);
var notequals = areequal.Count(x => !x);
使用Select
您可以选择elemest是否相等,然后使用count计算每个组。只有当list2的大小至少与list1相同时,此方法才有效(但有问题的是注意列表大小相同)
但如果在某些情况下这些列表的大小不同,请将第一行更改为:
var areequal = list1.Take(Math.Min(list2.Count, list.Count))
.Select((x, i) => list2[i] == x);
Take
会确保list1
中所有已处理的元素与list2
的大小相同。