如何在查询语法 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 };
...然后输出变为:
我想从几个列表中找到笛卡尔积:
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 };
...然后输出变为: