我有两个相同类型的不同列表。我想比较两个列表,并需要获取不匹配的值。 课程清单:
public class pre
{
public int id {get; set;}
public datetime date {get; set;}
public int sID {get; set;}
}
两个清单:
List<pre> pre1 = new List<pre>();
List<pre> pre2 = new List<pre>();
查询我写的以获得不匹配的值:
var preResult = pre1.where(p1 => !pre
.any(p2 => p2.id == p1.id && p2.date == p1.date && p2.sID == p1sID));
但结果在这里错了。我在pre1中获得所有值。
答案 0 :(得分:4)
这是解决方案:
class Program
{
static void Main(string[] args)
{
var pre1 = new List<pre>()
{
new pre {id = 1, date =DateTime.Now.Date, sID=1 },
new pre {id = 7, date = DateTime.Now.Date, sID = 2 },
new pre {id = 9, date = DateTime.Now.Date, sID = 3 },
new pre {id = 13, date = DateTime.Now.Date, sID = 4 },
// ... etc ...
};
var pre2 = new List<pre>()
{
new pre {id = 1, date =DateTime.Now.Date, sID=1 },
// ... etc ...
};
var preResult = pre1.Where(p1 => !pre2.Any(p2 => p2.id == p1.id && p2.date == p1.date && p2.sID == p1.sID)).ToList();
Console.ReadKey();
}
}
注意:属性日期包含日期,时间部分为00:00:00。
答案 1 :(得分:0)
我修复了一些拼写错误并使用合理的值测试了您的代码,您的代码将正确选择不匹配的记录。正如prabhakaran S's answer所提到的,也许您的日期值包含不同的时间组件。您需要检查数据并决定如何继续。
但是,从一个列表中选择不匹配的记录与另一个列表进行比较的更好方法是使用常用的左连接技术来处理关系数据库,您也可以在Linq中对内存中的集合进行操作。随着输入大小的增加,它会更好地扩展。
var preResult = from p1 in pre1
join p2 in pre2
on new { p1.id, p1.date, p1.sID }
equals new { p2.id, p2.date, p2.sID } into grp
from item in grp.DefaultIfEmpty()
where item == null
select p1;