使用LINQ比较两个列表

时间:2011-11-02 14:49:31

标签: c# linq

我有三个列表,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

3 个答案:

答案 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