首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么求两个list的差集

2013-09-13 
如何求两个list的差集 ListProduct products new ListProduct(){new Product{Id1},new Product{Id

如何求两个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                                
                                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();
求差集,因为即使对象的值相等,对象也是不同的,所以,不能求出差集来;
所以想请问一下,有什么方法可以求差集呢?两个百万条数据的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();
[解决办法]

引用:

Quote: 引用:

试一下下面的代码:
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();


这个new MyEqualityComparer()有什么用呢?这样算不出来,结果还是和products一样的值


Object.ReferenceEquals(x, y);这是是指比较引用地址是否相同

6L只是给你个例子而已,你把这段改成

return x.Id==y.Id;

假设你是根据Id相同来进行相同比较的
[解决办法]
引用:
Quote: 引用:

重写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)就可以了

热点排行