按条件在列表中获取元素与其他列表

时间:2015-05-12 10:19:44

标签: c# linq lambda

我有两个相同对象的列表,它们的大小不同。

我不会在List2中的所有对象中,其中tmDate在List2中不存在。

public class MyObj
{
    public MyObj(DateTime tmDate)
    {
        this.tmDate = tmDate;
    }
    public DateTime tmDate { get; set; }
}

var List1 = new List<MyObj>();
        var List2 = new List<MyObj>();

        List1.Add(new MyObj(new DateTime(2015, 01, 01)));
        List1.Add(new MyObj(new DateTime(2015, 01, 02)));
        List1.Add(new MyObj(new DateTime(2015, 01, 03)));

        List2.Add(new MyObj(new DateTime(2015, 01, 01)));
        List2.Add(new MyObj(new DateTime(2015, 01, 02)));

        var notMatchingObj =
            List1.Where(
                l1 => List2.Any(l2 => l2.tmDate != l1.tmDate));

这段代码给了我错误的输出..我只想在这种情况下使用tmDate 2015-01-03 MyObj

2 个答案:

答案 0 :(得分:3)

你可以尝试这个:

var result = list1.Where(item=>!list2.Any(item2=>item2.tmDate==item.tmDate));

如果list2.Any(item2=>item2.tmDate==item.tmDate)中的任何项目与list2具有相同的日期,则此item会返回true。否则返回false。把它当作否定,我们得到了我们想要的。

另一方面,List2.Any(l2 => l2.tmDate != l1.tmDate)如果在List2中找到任何项目,其日期与l1的日期不同,则返回true。这并不意味着不存在与l1具有相同日期的对象。如果您检查的第一个项目的日期与l1不同,则上述内容将返回true。但是,List2中的某个项目可能与l1具有相同的日期。

答案 1 :(得分:-1)

尝试

var notMatchingObj =
                from list1 in List1
                where (!List2.Any(l2 => l2.tmDate == list1.tmDate))
                select new { list1.tmDate };