使用linq比较两个列表

时间:2014-07-26 13:26:59

标签: linq list

enter image description here

我有两张清单,如图所示。我想要输出的是需要从列表2中删除列表1中不存在的状态,如下所示。感谢

enter image description here

3 个答案:

答案 0 :(得分:2)

您可以使用Intersect方法

var list1 = new [] {1,2,4};
var list2 = new [] {1,2,3};
list1.Intersect(list2);

这将给出结果1,2

或者,如果您使用的是您创建的类,则需要创建一个比较器来告诉交叉方法什么等于什么。

        var productList1 = new List<Product>();
        productList1.Add(new Product { Code = 1, Name = "Pears" });
        productList1.Add(new Product { Code = 2, Name = "Rasbries" });
        productList1.Add(new Product { Code = 3, Name = "Apple" });

        var productList2 = new List<Product>();
        productList2.Add(new Product { Code = 1, Name = "Pears" });
        productList2.Add(new Product { Code = 2, Name = "Rassbeyreys" });
        productList2.Add(new Product { Code = 4, Name = "Avocado" });

        var result = productList1.Intersect(productList2, new ProductComparer());


public class ProductComparer : IEqualityComparer<Product>
{
    public bool Equals(Product x, Product y)
    {
        return x.Code == y.Code;
    }

    public int GetHashCode(Product obj)
    {
        return obj.Code;
    }
}

答案 1 :(得分:1)

for(int i=0;i<list2.Count;i++)
{
    if(!list1.Select(p=>p.State).Contains(list2[i].State))
    {
        list2.RemoveAt(i);
    }
}

或:

var improve_list2 = (from c in list2
                     where list1.Select(p=>p.State).Contains(c.State)
                     select c).ToArray();

答案 2 :(得分:1)

这是典型的内连接,因此您可以使用LINQ Join方法:

var list3 = list2.Join(list1, x => x.State, y => y.State, (x, y) => x)
                 .ToList();