linq 使DefaultIfEmpty返回null

3xiyfsfu  于 2024-01-03  发布在  其他
关注(0)|答案(2)|浏览(145)

我有一个类,它有4个可空的double字段:

public class myClass
{
    public double? i1;
    public double? i2;
    public double? i3;
    public double? i4;
}

字符串
我有4个列表,它们可能包含不同的值或为空,例如:

List<double> inputs1 = new List<double> { 1, 2, 3 };
List<double> inputs2 = new List<double> { 4, 5 };
List<double> inputs3 = new List<double> { };
List<double> inputs4 = new List<double> { 8, 9 };


现在,我想创建一个myClass的示例列表,其中包含这些值的所有可能组合。为了避免复杂的foreach循环(在完整的应用程序中,myClass中有更多的列表和字段),我使用这个LINQ表达式:

List<myClass> myObjects = (
    from double? input1 in inputs1.DefaultIfEmpty()
    from double? input2 in inputs2.DefaultIfEmpty()
    from double? input3 in inputs3.DefaultIfEmpty()
    from double? input4 in inputs4.DefaultIfEmpty()
    select new myClass()
    {
       i1 = input1,
       i2 = input2,
       i3 = input3,
       i4 = input4
    }
).ToList();


DefaultIfEmpty()背后的意图是,如果这些列表中的任何一个是空的(如本例中的inputs3),对象创建仍然会发生,但相应的值不会写入,i3仍然是null。问题是DefaultIfEmpty()似乎返回0,因此i3变成0而不是null
我似乎找不到正确的方法来“告诉”DefaultIfEmpty()在列表为空时返回null。我尝试了DefaultIfEmpty((double?)null),但编译器不接受这样的语法。
有人能帮忙吗?

8ftvxx2r

8ftvxx2r1#

default(double)是0,但default(double?)null。所以你可以用List<double?>代替List<double>

List<double?> inputs1 = new() { 1, 2, 3 };
List<double?> inputs2 = new() { 4, 5 };
List<double?> inputs3 = new() { };
List<double?> inputs4 = new() { 8, 9 };

字符串
如果修改会带来困难,您可以在处理时始终转换为double?

List<myClass> myObjects = (
    from double? input1 in inputs1.Select(x => (double?)x).DefaultIfEmpty()
    from double? input2 in inputs2.Select(x => (double?)x).DefaultIfEmpty()
    from double? input3 in inputs3.Select(x => (double?)x).DefaultIfEmpty()
    from double? input4 in inputs4.Select(x => (double?)x).DefaultIfEmpty()
    select new myClass()
    {
        i1 = input1,
        i2 = input2,
        i3 = input3,
        i4 = input4
    }
).ToList();

ig9co6j1

ig9co6j12#

您可以使用Cast<double?>将枚举器的类型更改为nullable,因此默认值为null

List<myClass> myObjects = (
    from double? input1 in inputs1.Cast<double?>.DefaultIfEmpty()
    from double? input2 in inputs2.Cast<double?>.DefaultIfEmpty()
    from double? input3 in inputs3.Cast<double?>.DefaultIfEmpty()
    from double? input4 in inputs4.Cast<double?>.DefaultIfEmpty()
    select new myClass()
    {
       i1 = input1,
       i2 = input2,
       i3 = input3,
       i4 = input4
    }
).ToList();

字符串

相关问题