【问题标题】:Three-way Linq list intersection plus nulls in one list三路 Linq 列表交集加上一个列表中的空值
【发布时间】:2014-01-27 22:55:24
【问题描述】:

我有三个 MyObject 类型的列表 A、B 和 C。我需要根据一个公共 Key 获取 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}

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

谢谢,

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    只需对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
        );
    

    【讨论】:

    • 谢谢@DStanley。您发布的查询引发了编译错误,但我将其更改为:` 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 // 这将包括没有匹配 a 的 c。from ac in ca.DefaultIfEmpty() select new { a = ac, b, c } // 如果没有找到 a,ac 将为 null );` 并且它起作用了。
    • 我也试图解决这个问题,但在ac.a 部分出现错误,但一个非常好的解决方案 +1
    • @AdolfoPerez 好的,我已经修改了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多