当其中一个组为空时,笛卡尔积产生 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
};
考虑 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
};