【问题标题】:How can I compare two Lists and create another list where the match?如何比较两个列表并创建另一个匹配的列表?
【发布时间】:2011-08-27 08:00:38
【问题描述】:

我有以下两个列表:

IEnumerable<bool> a =      True True True False
List<bool> b = True True False False

如果列表 a 和列表 b 的元素匹配,我需要创建另一个显示 true 的列表。列表 a 和 b 将始终被填充并具有相同数量的元素。因此,例如输出将是:

List<bool> c = True True False True

有没有一种简单的方法可以做到这一点?我必须使用LINQ吗?我想我可以通过遍历数组来做到这一点,但我希望有一种更简单的方法。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    如果您使用的是 .NET 4,则可以使用 LINQ through IEnumerable.Zip 将两个列表一起“压缩”到第三个结果列表中。 Zip 对两个列表中的协调元素进行操作以生成第三个列表。

    第二个参数是一个函数,定义你想对每对元素做什么。

    var c = a.Zip(b, (p, q) => p == q).ToList();
    

    【讨论】:

      【解决方案2】:

      你可以使用SequenceEquals:

      lst1.SequenceEquals(lst2);
      

      此外,如果您需要逐个元素检查,您可以使用Select 子句(如果您有不可枚举的列表或数组):

      lst1.Select((x,index)=>lst2[index] == x);
      

      【讨论】:

        【解决方案3】:

        有两种方法可以解决这个问题:

        1)如果数据不多,就循环一遍,新建一个List

        2) 实现 IEnumerable 并在两个列表中创建自己的视图(将它们作为构造函数),并实现方法以便它们使用底层列表(即对于 Current : get,在两个列表之间进行比较实时)

        【讨论】:

          【解决方案4】:

          使用位运算符,您可以手动编码每个元素以进行比较或使用循环。

          class Program
          {
              static void Main(string[] args)
              {
                  IEnumerable<bool> a = new List<bool>() { true, true, true, false };
                  List<bool> b = new List<bool>() { true, true, false, false };
                  List<bool> answers = new List<bool>();
                  for (int i = 0; i < b.Count; i++)
                  {
                      answers.Add(a.ElementAt<bool>(i) & b.ElementAt<bool>(i));
          
                  }
          
                   foreach (bool B in answers)
                      Console.WriteLine(B);
          
                   Console.ReadKey();
          
               }
           }
          

          【讨论】:

          • 是的,但是如何将位运算符应用于我的两个列表?不循环可以吗?
          【解决方案5】:

          这是一个非常简单的方法,无需使用 LINQ,而是使用老式的 for 循环 :-)

          在这种方法中,您必须将IEnumerable&lt;bool&gt; 转换为List&lt;bool&gt;,但这很简单。

                  IEnumerable<bool> z = new List<bool> { true, true, true, false };
                  var a = new List<bool>(z);
                  var b = new List<bool> { true, true, false, false };
                  var result = new List<bool>();
          
                  for (int i = 0; i < b.Count ; i++) {
                      result.Add(a[i] && b[i]);
                   }
          
          
                  foreach (var r in result)
                          Console.WriteLine(r);
          

          【讨论】:

            【解决方案6】:

            您可以使用 IComparable 并比较两个列表并在 ghosts 列表中获取结果。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-12-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多