我已经在互联网上试图找到解决方案,也许我不会以正确的方式解决这个问题。
我需要比较两个数据集,结构相同,并希望找到新的和更改的对象(使用LINQ)。
使用我在CodeProject找到的内容,我能够将已更改的项目列表汇总在一起,但这是通过对每列进行硬编码(并且会有很多)来完成的,并检查相同的价值观:
var updRec = from u in updated
join o in orig
on u.KeyValue equals o.KeyValue
where
(o.Propery1 != u.Propery1) ||
(o.Propery2 != u.Propery2)
select new record
{
KeyValue = u.KeyValue,
Propery1 = u.Propery1,
Propery2 = u.Propery2 ,
RecordType = "mod" // Modified
};
我可以使用2件事的帮助:
希望这很好地解释了。如果我没有正确地查看它,请随时指出处理此方案的其他方法。
答案 0 :(得分:1)
您可以使用LINQ Except()扩展方法。除了第二个列表中的内容之外,它将返回列表中的所有内容。
var orignalContacts = GetOrignal();
var updatedContacts = GetUpdated();
var changedAndNew = updatedContacts.Except(orignalContacts);
var unchanged = orignalContacts.Except(updatedContacts);
根据您的数据提供者,您可能需要在对象上覆盖Equals()和GetHashCode()。
答案 1 :(得分:0)
较慢地使用反射来遍历所有属性并动态比较它们
IDictionary<string, Tuple<object, object>> GetDifferentProperties<T>(T keyValue1, T keyValue2)
{
var diff = new Dictionary<string, object>();
foreach (var prop in typeof(T).GetProperties(BindingFlags.Public))
{
var prop1Value = prop.GetValue(keyvalue1);
var prop2Value = prop.GetValue(keyValue2);
if (prop1Value != prop2Value)
diff.Add(prop.Name, Tuple.Create(prop1Value, prop2Value));
}
return diff;
}
然后在你的代码中
var = results = (from u in updated
join o in orig
select new
{
Value1 = o.KeyValue,
Value2 = u.KeyValue
}).ToArray()
.Select(x => GetDifferentProperties(x.Value1, x.Value2))
.Select(DoSomestufWithDifference);