我有两个集合,这两个集合都有属性电子邮件。我需要在第一个列表中获得电子邮件不存在于第二个列表中的项目列表。对于SQL,我只会使用“not in”,但我不知道在LINQ中等价。怎么做呢?

到目前为止,我有一个连接,比如。

var matches = from item1 in list1
join item2 in list2 on item1.Email equals item2.Email
select new { Email = list1.Email };

但我不能加入,因为我需要的差异和连接将失败。我需要一些方法使用包含或存在我相信。我只是还没有找到这样做的例子。


当前回答

你可以使用Where和Any的组合来查找not in:

var NotInRecord =list1.Where(p => !list2.Any(p2 => p2.Email  == p.Email));

其他回答

或者你可以这样做:

var result = list1.Where(p => list2.All(x => x.Id != p.Id));

也可以使用All()

var notInList = list1.Where(p => list2.All(p2 => p2.Email != p.Email));
 DynamicWebsiteEntities db = new DynamicWebsiteEntities();
    var data = (from dt_sub in db.Subjects_Details
                                //Sub Query - 1
                            let sub_s_g = (from sg in db.Subjects_In_Group
                                           where sg.GroupId == groupId
                                           select sg.SubjectId)
                            //Where Cause
                            where !sub_s_g.Contains(dt_sub.Id) && dt_sub.IsLanguage == false
                            //Order By Cause
                            orderby dt_sub.Subject_Name

                            select dt_sub)
                           .AsEnumerable();
                  
                                SelectList multiSelect = new SelectList(data, "Id", "Subject_Name", selectedValue);

    //======================================OR===========================================

    var data = (from dt_sub in db.Subjects_Details

                               
                            //Where Cause
                            where !(from sg in db.Subjects_In_Group
                                           where sg.GroupId == groupId
                                           select sg.SubjectId).Contains(dt_sub.Id) && dt_sub.IsLanguage == false

                            //Order By Cause
                            orderby dt_sub.Subject_Name

                            select dt_sub)

                           .AsEnumerable();

您需要使用Except运算符。

var answer = list1.Except(list2);

更好的解释在这里:https://learn.microsoft.com/archive/blogs/charlie/linq-farm-more-on-set-operators

注意:此技术仅适用于基本类型,因为您必须实现一个IEqualityComparer才能对复杂类型使用Except方法。

你可以在两个不同的列表中取两个集合,比如list1和list2。

然后就写

list1.RemoveAll(Item => list2.Contains(Item));

这是可行的。