本文共 1435 字,大约阅读时间需要 4 分钟。
已知有类
class Item{ public int id { get; set; } public string result { get; set; } public override string ToString() { return $"{result}{id}"; }}
兩個實例:
List- oldSet = new List
- { new Item { id = 1, result ="old"}, new Item { id = 2, result ="old"}, new Item { id = 3, result ="old"},};List
- newSet = new List
- { new Item { id = 2, result ="new"}, new Item { id = 3, result ="new"}, new Item { id = 4, result ="new"},};
現想合并两个列表,结果如下:
List mergedSet = [{old1, null}, {old2, new2}, {old3, new3}, {null, new4}];
實現方法1:兩次左联接,加上1次Union
var mergedSet = oldSet.Select(o => new { OldSet = o, NewSet = newSet.FirstOrDefault(n => n.id == o.id)}) .Union(newSet.Where(n => oldSet.All(o => o.id != n.id)).Select(n => new { OldSet = (Item) null, NewSet = n}));
方法2:兩次GroupJoin,加1次Union。DefaultIfEmpty,左联接時,即外联接不存在對應的元素,也会列出左聯接的元素。
var mergedSet = (from o in oldSet join n in newSet on o.id equals n.id into ns from n in ns.DefaultIfEmpty() select new { OldSet = o, NewSet = n }) .Union(from n in newSet join o in oldSet on n.id equals o.id into os from o in os.DefaultIfEmpty() select new { OldSet = o, NewSet = n }) .Distinct();
转载地址:http://iimdi.baihongyu.com/