C# 实现FULL JOIN 效果
参考:https://dotnettutorials.net/lesson/full-outer-join-in-linq/
思路就是先left join 再right join,最后union
思路就是先left join 再right join,最后union
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | namespace Test { internal class Program { static void Main( string [] args) { // 创建测试数据 var listA = new List<ItemA> { new ItemA { Key = 1, Value = "A1" }, new ItemA { Key = 2, Value = "A2" }, new ItemA { Key = 3, Value = "A3" } }; var listB = new List<ItemB> { new ItemB { Key = 1, Value2 = "B1" }, new ItemB { Key = 2, Value2 = "B2" }, // Comment or uncomment the following line to test with a null entry new ItemB { Key = 4, Value2 = "B4" } }; // 执行 full join var leftJoinQuery = from itemA in listA join itemB in listB on itemA.Key equals itemB.Key into gj from subItemB in gj.DefaultIfEmpty() select new { Key = itemA.Key, ValueA = itemA.Value, ValueB = (subItemB == null ) ? default : subItemB.Value2 }; var rightJoinQuery = from itemB in listB join itemA in listA on itemB.Key equals itemA.Key into gj from subItemA in gj.DefaultIfEmpty() select new { Key = itemB.Key, ValueA =(subItemA == null )? default : subItemA.Value, ValueB = itemB.Value2 }; var fullJoinQuery= leftJoinQuery.Union(rightJoinQuery); // 输出结果 foreach ( var result in fullJoinQuery) { Console.WriteLine($ "Key: {result.Key}, ValueA: {result.ValueA}, Value2: {result.ValueB}" ); } } } // 测试模型 class ItemA { public int Key { get ; set ; } public string Value { get ; set ; } } class ItemB { public int Key { get ; set ; } public string Value2 { get ; set ; } } } |
结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!