三向Linq列表交集加上一个列表中的空值

时间:2014-01-27 14:30:23

标签: c# linq

我有三个类型MyObject的A,B和C列表。我需要根据一个公共密钥获得A,B和C之间交集的列表:

public class MyObject
{
    public MyObject(string key)
    {
        Key = key;
    }

    public string Key { get; set; }
}

  var listA = new List<MyObject>
        {
            new MyObject("1"),
            new MyObject("2")
        };

        var listB = new List<MyObject>
        {
            new MyObject("1"),
            new MyObject("2"),
            new MyObject("3")
        };

        var listC = new List<MyObject>
        {
            new MyObject("1"),
            new MyObject("2"),
            new MyObject("3")
        };

        var query = (from b in listB
            join c in listC on b.Key equals c.Key
            join a in listA on c.Key equals a.Key
            select new { a, b, c}
        );

        var result = query.ToList();

工作正常,它会返回如下列表:

[0]: {a.Key = 1, b.Key = 1, c.Key = 1}
[1]: {a.Key = 2, b.Key = 2, c.Key = 2}

现在,我需要的是b和c之间的交集,但是包含非匹配a的空值:

[0]: {a.Key = 1, b.Key = 1, c.Key = 1}
[1]: {a.Key = 2, b.Key = 2, c.Key = 2}
[2]: {null, b.Key = 3, c.Key = 3}

我不想包含null b或c。只有null a。我尝试使用DefaultIfEmpty()扩展方法像左外连接一样,但是没有用。有关如何修改上述查询以获得预期结果的任何建议?

谢谢,

1 个答案:

答案 0 :(得分:2)

只需对a使用“左连接”:

    var query = (from b in listB
        join c in listC on b.Key equals c.Key
        join a in listA on c.Key equals a.Key into ca  // this will include c's with no matching a's.
        from ac in ca.DefaultIfEmpty()
        select new { a = ac, b, c}    // ac will be null if no a is found
    );