如何比较两个列表并创建匹配的另一个列表?

时间:2011-08-27 08:00:38

标签: c# linq

我有以下两个清单:

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

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

List<bool> c = True True False True

我能用这么简单的方法吗?我必须使用LINQ吗?我想我可以通过数组进行迭代,但我希望有一种更简单的方法。

6 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

您可以使用SequenceEquals

lst1.SequenceEquals(lst2);

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

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

答案 2 :(得分:0)

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

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();

     }
 }

答案 3 :(得分:0)

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

1)如果没有大量数据,只需循环并创建一个新的列表

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

答案 4 :(得分:0)

这是一个非常简单的方法,不使用LINQ,但使用良好的老式for循环: - )

在这种方法中,您必须将IEnumerable<bool>转换为List<bool>,但这很简单。

        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);

答案 5 :(得分:0)

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