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中的客户?
答案 0 :(得分:13)
理想情况下,让您的Customer
类覆盖GetHashCode
和Equals
(更好的是,实施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);