判断两个集合 笛卡尔乘机操作

1.适用于基本属性的集合

  • Intersect() 获取两个集合共有的部分

  • Except() 获取前有后没有的部分

  • 自带方法如果操作复杂的集合的话,应该是匹配的是全部属性
List<int> a=new List<int>(){1,2,3};
List<int> b=new List<int>(){2,3,4};
var list=a.Intersect(b);//获取a,b共有的部分  2,3  List<int> 类型
var list=a.Except(b);//获取a有b没有的部分 1

2.适用于复杂集合的操作

  • 获取两个集合中 Id 共有的部分

public class Model
{
    public int Id{get;set;}
    public string Name{get;set;}
}
List<Model> a=new List<Model>()
{
    new Model(){Id=1,Name="a"},
    new Model(){Id=2,Name="b"}
}
List<Model> b=new List<Model>()
{
    new Model(){Id=1,Name="a"},
    new Model(){Id=3,Name="c"}
}

var r = a.Where(l => b.Exists(s => l.Id == s.Id)).ToList();//Id共有的部分,意思是 如果 a中的Id 一旦满足 与b中的Id元素一致,那么就获取a 中满足条件的部分

var r = a.Where(s => !b.Exists(l => s.Id == l.Id)).ToList();//a id有 b 没有的 部分

 

3.数据库中也可以实现以上操作,如 Union (All) 并集 intersect 交集 except 差集 ,也是适合简单的操作一个字段    [sql 并交差资料](http://www.cnblogs.com/kissdodog/archive/2013/06/24/3152743.html)

4.在做类似项目的时候遇到一个问题,当集合类型是 IEnumerable<> 的时候是不存在 Exists 方法的,我的做法如下,用 .ToList() 现将其转换成 List 集合,即可解决此问题,并且 Linq 最后用 .ToList() 后可以

var list = model.List.ToList();
var needDeleteSupploerList = controllerSupplierList.Where(s => !list.Exists(l => s.Id == l.Id)).ToList();

 

posted on 2019-01-29 11:23 猴dai王也有悲伤时 阅读(...) 评论(...) 编辑 收藏