【问题标题】:Getting the number of elements that are the same at the same index获取同一索引处相同的元素个数
【发布时间】:2015-11-19 08:03: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

【问题讨论】:

    标签: c# arrays linq c#-4.0


    【解决方案1】:

    是的,使用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 可以选择elemest 是否相等,然后使用count 对每个组进行计数。此方法仅在 list2 至少与 list1 大小相同时才有效(但问题是列表大小相同)

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-08-28
        • 2020-11-27
        • 2018-08-09
        • 1970-01-01
        • 2018-05-02
        • 2016-03-31
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        相关资源
        最近更新 更多