比较列表并使用LINQ返回公共对象

时间:2011-04-18 18:25:17

标签: c# linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Customer> custList = new List<Customer>();

            custList.Add(new Customer { Name = "P1" });
            custList.Add(new Customer { Name = "P2" });
            custList.Add(new Customer { Name = "P3" });
            custList.Add(new Customer { Name = "P4" });
            custList.Add(new Customer { Name = "P5" });

            List<Customer> vendorList = new List<Customer>();
            vendorList.Add(new Customer { Name = "P1" });
            vendorList.Add(new Customer { Name = "P2" });

            //var v = custList.SelectMany(


        }
    }

    public class Customer
    {
        public string Name { get; set; }
    }

}

我如何复制这两个列表,只查找custList和vendorList中的客户?

6 个答案:

答案 0 :(得分:13)

理想情况下,让您的Customer类覆盖GetHashCodeEquals(更好的是,实施IEquatable<Customer>)。然后你可以使用:

var customerVendors = custList.Intersect(vendorList);

否则,您将实施IEqualityComparer<T>来比较客户的相等性(例如,通过名称,但您可以选择其他比较),然后使用:

var customerVendors = custList.Intersect(vendorList, new CustomerComparer());

请注意,这些都将返回IEnumerable<Customer>,这将被延迟评估。有时这就是你想要的,但如果你真的需要List<Customer>,最后只需要打{{1​​}},例如

ToList()

答案 1 :(得分:7)

从评论到另一个答案:

  

Intersect期望两个列表都是   相同的类型。如果不是这样的话怎么办?   相同的类型,如果属性名称是什么   两个列表都不同?我该怎么用   SelectMany here

在这种情况下,您可能希望使用Join。如

var result = from item1 in list1
             join item2 in list2
             on item1.Foo equals item2.Bar
             select new { item1, item2 }; // select whatever you need in the resultset

答案 2 :(得分:4)

如果您的Customer类实现了“Equals()之类的值,您可以这样做:

var inbothLists = custList.Intersect(vendorList).ToList();

否则,您可以使用传递自定义IEQualityComparer的重载,您可以在单独的类中实现该注册(CustomerComparer):

var inbothLists = custList.Intersect(vendorList, new CustomerComparer())
                          .ToList();

答案 3 :(得分:1)

使用Intersect方法。

答案 4 :(得分:0)

var commonList = custList.Intersect(vendorList);

您只需要IEqualityComparer即可根据名称进行比较。

答案 5 :(得分:0)

var both  = (from a  in custList 
             join b in vendorList on a.Name equals b.Name 
             select a);