合并LINQ中的2个列表

Jos*_*s57 7 linq vb.net

我有两个自定义对象列表:

List1: Year, Month, ValueA
List2: Year, Month, ValueB
Run Code Online (Sandbox Code Playgroud)

我想得到第二个List,两者合并:

List3: Year, Month, ValueA, ValueB
Run Code Online (Sandbox Code Playgroud)

在LINQ VB.Net中有没有优雅的方法来执行它?

例:

List1:
2010 - 6 - 2
2010 - 7 - 5
2010 - 10 - 3

List2:
2010 - 7 - 2
2010 - 8 - 1
2010 - 10 - 2

List3 (result):
2010 - 6 - 2 - 0
2010 - 7 - 5 - 2
2010 - 8 - 0 - 1
2010 - 10 - 3 - 2
Run Code Online (Sandbox Code Playgroud)

提前致谢.

解决方案 VB.Net解决方案的解决方案:

Dim ListA = From a In List1
    Group Join b In List2
    On a.Year Equals b.Year And a.Month Equals b.Month Into bGroup = Group
    From b In bGroup.DefaultIfEmpty()
    Select a.Year, a.Month, a.Value1, Value2 = If(b Is Nothing, 0, b.Value2)
Dim ListB = From b In List2
    Group Join a In List1
    On b.Year Equals a.Year And b.Month Equals a.Month Into aGroup = Group
    From a In aGroup.DefaultIfEmpty()
    Select b.Year, b.Month, Value1 = If(a Is Nothing, 0, a.Value1), b.Value2
Dim List3 = ListA.Union(ListB)
Run Code Online (Sandbox Code Playgroud)

use*_*116 8

当然,您正在寻找对LINQ中不存在的数据执行完全外部联接,因此我们使用两个联合左外部联接伪造它:

var A = from a in List1
    join b in List2 on new { a.Year, a.Month } equals new { b.Year, b.Month }
        into bgroup
    from b in bgroup.DefaultIfEmpty()
    select new { a.Year, a.Month, a.ValueA, ValueB = (b == null ? 0 : b.ValueB) };

var B = from b in List2
    join a in List1 on new { b.Year, b.Month } equals new { a.Year, a.Month } 
        into agroup
    from a in agroup.DefaultIfEmpty()
    select new { b.Year, b.Month, ValueA = (a == null ? 0 : a.ValueA), b.ValueB };

var List3 = A.Union(B);
Run Code Online (Sandbox Code Playgroud)

很多为C#道歉,我无法让我的VB.Net示例为我的生活工作.你需要联合两个左外连接来产生正确的答案.我尝试过的代码转换器都没有.


以下是LINQPad所引发的VB.Net,但我能找到的每个例子都应该是正确的:

Dim A = From a In List1 _
    Group Join b In List2 _
        On New With { a.Year, a.Month } Equals New With { b.Year, b.Month} _
        Into bGroup = Group _
    From b In bGroup.DefaultIfEmpty() _
    Select a.Year, a.Month, a.ValueA, ValueB = If(b Is Nothing, 0, b.ValueB)

Dim B = From b In List2 _
    Group Join a In List1 _
        On New With { b.Year, b.Month } Equals New With { a.Year, a.Month} _
        Into aGroup = Group _
    From a In aGroup.DefaultIfEmpty() _
    Select b.Year, b.Month, ValueA = If(a Is Nothing, 0, a.ValueA), b.ValueB

Dim List3 = A.Union(B)
Run Code Online (Sandbox Code Playgroud)