110,532
社区成员
发帖
与我相关
我的任务
分享
List<Product> products = new List<Product>(){
new Product{Id=1},
new Product{Id=2},
new Product{Id=3},
new Product{Id=4},
new Product{Id=5},
new Product{Id=6},
new Product{Id=1},
new Product{Id=7},
new Product{Id=8},
};
List<Product> product1 = new List<Product>(){
new Product{Id=1},
new Product{Id=7},
new Product{Id=8},
new Product{Id=9},
new Product{Id=10},
new Product{Id=11}
};
List<Product> p1 = (from a in products
where !(from b in product1
select b.Id).ToList().Contains(a.Id)
select a).ToList();
会比较慢,因为这里只是举一个简单的例子,实际我要查的两个list都是百万级的;(这里只有一个id,百万级list的条件有三个id要比较,就更慢了)List<Product> p2 = products.Except(product1).ToList();
求差集,因为即使对象的值相等,对象也是不同的,所以,不能求出差集来; public class MyEqualityComparer : IEqualityComparer<Product>
{
public bool Equals(Product x, Product y)
{
return x.Id == y.Id;
}
public int GetHashCode(Product obj)
{
return obj.Id;
}
}
可以了,谢谢;public override bool Equals(object obj)
{
bool equal = false;
Product p = obj as Product;
if (p != null)
{
equal = this.Id == p.Id;
}
return equal;
}
[quote=引用 7 楼 yishuaijun 的回复:] [quote=引用 6 楼 iamwangshao 的回复:] 试一下下面的代码: public class MyEqualityComparer : IEqualityComparer<Product> { public bool Equals(Product x, Product y) { return Object.ReferenceEquals(x, y); } public int GetHashCode(Product obj) { return obj.GetHashCode(); } } List<Product> p2 = products.Except(product1, new MyEqualityComparer()).ToList();
重写Product的Equals方法就可以用Except了
[quote=引用 6 楼 iamwangshao 的回复:] 试一下下面的代码: public class MyEqualityComparer : IEqualityComparer<Product> { public bool Equals(Product x, Product y) { return Object.ReferenceEquals(x, y); } public int GetHashCode(Product obj) { return obj.GetHashCode(); } } List<Product> p2 = products.Except(product1, new MyEqualityComparer()).ToList();
试一下下面的代码: public class MyEqualityComparer : IEqualityComparer<Product> { public bool Equals(Product x, Product y) { return Object.ReferenceEquals(x, y); } public int GetHashCode(Product obj) { return obj.GetHashCode(); } } List<Product> p2 = products.Except(product1, new MyEqualityComparer()).ToList();