如何求两个list的差集
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会比较慢,因为这里只是举一个简单的例子,实际我要查的两个list都是百万级的;(这里只有一个id,百万级list的条件有三个id要比较,就更慢了)
where !(from b in product1
select b.Id).ToList().Contains(a.Id)
select a).ToList();
而用这个
List<Product> p2 = products.Except(product1).ToList();求差集,因为即使对象的值相等,对象也是不同的,所以,不能求出差集来;
所以想请问一下,有什么方法可以求差集呢?两个百万条数据的list,希望能快一点查出来
谢谢各位大神了 数据 list 差集
[解决办法]
重写Product的Equals方法就可以用Except了
[解决办法]
Except还有支持IEqualityComparer的
[解决办法]
试一下下面的代码:
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();
[解决办法]
Object.ReferenceEquals(x, y);这是是指比较引用地址是否相同
6L只是给你个例子而已,你把这段改成
return x.Id==y.Id;
假设你是根据Id相同来进行相同比较的
[解决办法]
不懂,请问你可以写一下代码给我不?
重写Product的Equals方法就可以用Except了
我在8楼已经帮你改了
如果重写Equals方法的话这样,将这个方法加在Product类里面
public override bool Equals(object obj)
{
bool equal = false;
Product p = obj as Product;
if (p != null)
{
equal = this.Id == p.Id;
}
return equal;
}
------解决方案--------------------
List<Product> p2 = products.Except(product1, new MyEqualityComparer()).ToList();
他都帮你全都写好了啊。。。。。
如果用重写Equals的方法,只要products.Except(product1)就可以了