如何在查询语法 linq 中包含空列表?

How can I include empty lists in query syntax linq?

我想从几个列表中找到笛卡尔积:

var list1 = new List<int> { 1, 2, 3};
var list2 = new List<string> { "A" };
var list3 = new List<int>();

我试图获得的最终结果是包含所有可能组合的对象列表:

{ list1Value: 1, list2Value: "A", list3Value: null },
{ list1Value: 2, list2Value: "A", list3Value: null },
{ list1Value: 3, list2Value: "A", list3Value: null }

为此,我使用了 linq 查询语法:

var combinations = from value1 in list1
    from value2 in list2
    from value3 in list3
    select new Combination
    {
        List1Value: value1,
        List2Value: value2,
        List3Value: value3
    }

但是,因为list3是空的,所以combinations也是空的。如果我给 list3 至少 1 个项目,那么一切正常。我如何处理查询语法中的空列表,以便它仍然从其他列表中进行选择?

给你:

var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<string> { "A" };
var list3 = new List<int>();

var combinations =
    from value1 in list1
    from value2 in list2
    from value3 in
        list3
            .Select(x => (int?)x)
            .DefaultIfEmpty()
    select new
    {
        List1Value = value1,
        List2Value = value2,
        List3Value = value3
    };

关键的变化是使用 .Select(x => (int?)x)int 变成 int? 然后允许 .DefaultIfEmpty() 到 return null ,从而在缺少值时使输出清晰。

我得到的输出是:

如果我进行此更改:

var list3 = new List<int>() { 0, 4 };

...然后输出变为: