如何求两个list的差集

KsonJsy 2013-09-12 10:54:51
 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,希望能快一点查出来
谢谢各位大神了
...全文
316 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
人生导师 2013-09-13
  • 打赏
  • 举报
回复
使用Except方法,参考MSDN例子:http://msdn.microsoft.com/zh-cn/library/vstudio/bb300779.aspx
KsonJsy 2013-09-13
  • 打赏
  • 举报
回复
引用 12 楼 starfd 的回复:
List<Product> p2 = products.Except(product1, new MyEqualityComparer()).ToList(); 他都帮你全都写好了啊。。。。。 如果用重写Equals的方法,只要products.Except(product1)就可以了
 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;
            }
        }
可以了,谢谢;
  • 打赏
  • 举报
回复
你在不懂算法的情况下,linq的效率已经可以算最高的了。。。。。
KsonJsy 2013-09-13
  • 打赏
  • 举报
回复
引用 8 楼 starfd 的回复:
[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();
这个new MyEqualityComparer()有什么用呢?这样算不出来,结果还是和products一样的值[/quote] Object.ReferenceEquals(x, y);这是是指比较引用地址是否相同 6L只是给你个例子而已,你把这段改成 return x.Id==y.Id; 假设你是根据Id相同来进行相同比较的[/quote]我现在要求的就是效率,这个只是比较两个product的,我要求两个list的,不知道怎么用,总之就是效率一定要高
  • 打赏
  • 举报
回复
List<Product> p2 = products.Except(product1, new MyEqualityComparer()).ToList(); 他都帮你全都写好了啊。。。。。 如果用重写Equals的方法,只要products.Except(product1)就可以了
  • 打赏
  • 举报
回复
引用 9 楼 yishuaijun 的回复:
引用 1 楼 starfd 的回复:
重写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;
        }
KsonJsy 2013-09-13
  • 打赏
  • 举报
回复
引用 8 楼 starfd 的回复:
[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();
这个new MyEqualityComparer()有什么用呢?这样算不出来,结果还是和products一样的值[/quote] Object.ReferenceEquals(x, y);这是是指比较引用地址是否相同 6L只是给你个例子而已,你把这段改成 return x.Id==y.Id; 假设你是根据Id相同来进行相同比较的[/quote] 但是我调用的时候怎么调用呢?怎么求差集呢?不知道怎么调用,不好意思,比较笨,
KsonJsy 2013-09-13
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
重写Product的Equals方法就可以用Except了
不懂,请问你可以写一下代码给我不?
  • 打赏
  • 举报
回复
引用 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();
这个new MyEqualityComparer()有什么用呢?这样算不出来,结果还是和products一样的值[/quote] Object.ReferenceEquals(x, y);这是是指比较引用地址是否相同 6L只是给你个例子而已,你把这段改成 return x.Id==y.Id; 假设你是根据Id相同来进行相同比较的
KsonJsy 2013-09-13
  • 打赏
  • 举报
回复
引用 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();
这个new MyEqualityComparer()有什么用呢?这样算不出来,结果还是和products一样的值
小托尼 2013-09-12
  • 打赏
  • 举报
回复
试一下下面的代码: 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();
Bonjour-你好 2013-09-12
  • 打赏
  • 举报
回复
赞成1、2楼所说。 楼主可以看看MSDN的示例:http://msdn.microsoft.com/zh-cn/library/vstudio/bb300779.aspx
nanbaifeiliao 2013-09-12
  • 打赏
  • 举报
回复
楼上的代码的效率
五更琉璃 2013-09-12
  • 打赏
  • 举报
回复
foreach (var t1 in 大list) { foreach (var t2 in 小list) { if (t1.Id != t2.Id) { } } } 要求效率最好别用LINQ
  • 打赏
  • 举报
回复
Except还有支持IEqualityComparer的
  • 打赏
  • 举报
回复
重写Product的Equals方法就可以用Except了

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧