我有三个列表,BeforeList,AfterList和FinalList
BeforeList具有以下值
ID Description Operation
1 Descr1 Null
2 Descr2 Null
3 Descr3 Null
AfterList具有以下值
ID Description Operation
1 Descr1 Null
2 DescrC Null
4 Descr4 Null
我的FinalList将是
ID Description Operation
1 Descr1 Null
2 DescrC Update
3 Descr3 Delete
4 Descr4 Add
如何使用LINQ获取FinalList
答案 0 :(得分:3)
如下:
var beforeListById = beforeList.ToDictionary(item => item.Id);
var afterListById = afterList.ToDictionary(item => item.Id);
var finalResult = from id in beforeListById.Keys.Union(afterListById.Keys)
let before = beforeListById.ContainsKey(id) ? beforeListById[id] : null
let after = afterListById.ContainsKey(id) ? afterListById[id] : null
select new Record
{
Id = id,
Description = (after ?? before).Description,
Operation = (before != null && after != null)
? (after.Description == before.Description ? "Null" : "Update")
: (after != null) ? "Add" : "Delete"
};
编辑:使查询更简单(假设项目非空)。
答案 1 :(得分:1)
这是一个简单的实现,但您可以尝试这样的事情:
var differences = listA.Where(a => !listB.Any(b => b.id == a.id)).Union(listB.Where(b => !listA.Any(a => a.id == b.id)));
修改强>
根据MSDN,您可以使用Union
合并两个列表,默认情况下会过滤掉重复项。如果没有,您可以随时拨打Distinct()
:
List<Something> = beforeList.Union(afterList).ToList();
答案 2 :(得分:0)
您的列表上看起来需要明确的联合。这里讨论了一些可以提供语法示例的联盟:Linq to entities : Unions + Distinct