C# 即使一个集合为空,LINQ查询获取笛卡尔积的方法是什么?
假设我有两个列表,其中一个是空的:C# 即使一个集合为空,LINQ查询获取笛卡尔积的方法是什么?,c#,.net,linq,left-join,cartesian-product,C#,.net,Linq,Left Join,Cartesian Product,假设我有两个列表,其中一个是空的: List<string> foo = new List<string>(){ "Ali","wall-e","Ellie" }; List<string> bar = new List<string>(); 当条为空时,LINQ返回一个空结果集 问题: 如何编写上述查询以便接收此结果集: Ali,NULL Wall-e,NULL Ellie,NULL 也许这就是你想要的: var q = from f i
List<string> foo = new List<string>(){ "Ali","wall-e","Ellie" };
List<string> bar = new List<string>();
当条为空时,LINQ返回一个空结果集
问题:
如何编写上述查询以便接收此结果集:
Ali,NULL
Wall-e,NULL
Ellie,NULL
也许这就是你想要的:
var q = from f in foo.DefaultIfEmpty()
from b in bar.DefaultIfEmpty()
select new {f,b};
我不会称之为笛卡尔积,但我明白你想要什么。@ColonelPanic你是对的,如果一个“因子”集为空,则真正的笛卡尔积为空。我同意,但我想不出更好的提问方式。此外,我们还可以通过使用另一个重载指定DefaultIfEmpty(“”)。@SivaGopal当然,例如
.DefaultIfEmpty(“NULL”)
。当不指定任何内容时,我们为字符串获取默认值null
(null引用)。为什么foo.DefaultIfEmpty()
和foo.DefaultIfEmpty(null)
在from
子句中可以正常工作,但是foo.Any()?foo:null
抛出一个ArgumentNullException
?@Ruben9922这似乎是因为冒号后面的null
不是包含一个成员的集合的实例,该成员是null
。相反,它是一个缺少的集合,因此产生了异常。您可以使用类似于foo.Any()的东西?foo:新列表{null,}
。如果foo
有成员,那么它将被枚举两次(但当它只是内存中的.NET集合时,这并不是一个真正的问题;尽管如此,有了编译时List
,我还是会亲自编写foo.Count!=0
(.Count
属性是免费获取的),而不是foo.Any()
)。
var q = from f in foo.DefaultIfEmpty()
from b in bar.DefaultIfEmpty()
select new {f,b};