当其中一个组为空时,笛卡尔积产生 0 个元素

Cartesian Product results 0 elements when one of the groups in empty

考虑 4 组的当前笛卡尔积:

var cartesian =  (from elem1 in group1
     from elem2 in group2
     from elem3 in group3
     from elem4 in group4
     select new 
    {
       elem1 , elem2 , elem3 , elem4
    })

当其中一组为空时,cartesian 的结果为 0 个元素。

如何在不考虑哪个组为空或不为空的情况下做笛卡尔积?

当你的笛卡尔积中的一个集合为空时,你得到空集是正常的。

How can I do a cartesian product without taking into account which group is empty or not ?

我建议使用一个只有一个元素的虚拟非空集,并使用真值连接条件进行左连接。

var cartesian = 
    from dummy in new [] {0} 
    join elem1 in group1 on 1 equals 1 into g1
    from elem1 in g1.DefaultIfEmpty()
    join elem2 in group2 on 1 equals 1 into g2
    from elem2 in g2.DefaultIfEmpty()
    join elem3 in group3 on 1 equals 1 into g3
    from elem3 in g3.DefaultIfEmpty()
    join elem4 in group4 on 1 equals 1 into g4
    from elem4 in g4.DefaultIfEmpty()
    select new 
    {
        elem1 , elem2 , elem3, elem4
    };

更新

如@IvanStoev 所述,更简单的解决方案是:

var cartesian = 
    from elem1 in group1.DefaultIfEmpty()
    from elem2 in group2.DefaultIfEmpty()
    from elem3 in group3.DefaultIfEmpty()
    from elem4 in group4.DefaultIfEmpty()
    select new 
    {
        elem1 , elem2 , elem3 , elem4
    };