查询两个列表的可空关系集

时间:2014-08-20 17:13:07

标签: c# .net linq list linq-to-objects

如果我将这些列表作为输入:

List<Record> A = new List<Record> { new Record { Value = 1 }, new Record { Value = 2 }, new Record { Value = 3 }, new Record { Value = 4 }, new Record { Value = 5 } };
List<Record> B = new List<Record> { new Record { Value = 1 }, new Record { Value = 2 }, new Record { Value = 5 }, new Record { Value = 7 } };

所以从上面看,A有这些元素:

Record{Value = 1}
Record{Value = 2}
Record{Value = 3}
Record{Value = 4}
Record{Value = 5}

B有这些元素:

Record{Value = 1}
Record{Value = 2}
Record{Value = 5}
Record{Value = 7}

我想要以下输出。一个List<Tuple<Record, Record>>,在我们的例子中,列表如下:

Record{Value = 1} | Record{Value = 1}
Record{Value = 2} | Record{Value = 2}
Record{Value = 3} | null
Record{Value = 4} | null
Record{Value = 5} | Record{Value = 5}
null              | Record{Value = 7}

上面的第一列,代表我们元组中的第一个元素,只能包含A中的对象或null。上面的第二列代表我们元组中的第二个元素,只能包含B中的对象或null。记录不仅仅是一个值字段,因此不要将它们计为值类型,否则我会在我的问题中使用整数。

基本上,正如您在示例中所看到的,A中的对象进入第一列,B中的对象进入输出数据类型的第二列。如果“值”字段中存在匹配项,则它们并排排列。如果A和B之间的值字段没有匹配项,那么null就会出现在相反的一侧,无论哪里都没有匹配。

有没有办法让LINQ查询数据集A和B生成这样的结果数据类型?我对使用元组列表并不是那么严格。我会用字典或其他类型的...... [/ p>

1 个答案:

答案 0 :(得分:2)

您可以先通过将它们连接在一起并获取不同的值来创建两个列表中所有值的列表,然后您可以将这两个集合中的每一个加入该集合。

var values = A.Concat(B)
    .Select(record => record.Value)
    .Distinct();

var query = from value in values
    join a in A
    on value equals a.Value
    into aMatches
    join b in B
    on value equals b.Value
    into bMatches
    select Tuple.Create(aMatches.FirstOrDefault(), 
        bMatches.FirstOrDefault());