具有特定 “where” “is null” 的 C# lambda 表达式

c# lambda expression with specific "where" "is null"

提问人:Niels van Mierlo 提问时间:10/11/2023 最后编辑:Francis DucharmeNiels van Mierlo 更新时间:10/12/2023 访问量:84

问:

有人可以告诉我如何创建一个 c# lambda 表达式以获得以下结果:

我想获取所有值不以“B”开头的行。因此,结果中需要有 ID 为 1、3、4、5 和 6 的行。包括具有 NULL 值的那个。

编号 价值
1 答01
2 B01型
3
4
5 答02
6 答02
7 B02型

.Where(x => !x.Value.StartsWith("B"))未提供具有 NULL 值的行

提前致谢。

C# lambda null where-子句

评论

1赞 Selvin 10/11/2023
EF 还是 Linq ?它是字符串“NULL”还是 DbNull ?
5赞 Selvin 10/11/2023
像只使用“值为 null 或以......”开头的幼稚解决方案呢?
0赞 Tim Schmelter 10/12/2023
正如@Selvin所说,在问这个问题之前,你试过吗?.Where(x => x.Value == null || !x.Value.StartsWith("B"))
0赞 Olivier Jacot-Descombes 10/12/2023
不客气。另外,由于您是 StackOverflow 的新手,我想通知您,您可以通过检查答案旁边的勾号来投票给好的答案并接受对您帮助最大的答案。在这个网站上,点赞或接受的答案算作“感谢”。

答:

1赞 Francis Ducharme 10/11/2023 #1

怎么样

list.Where(x => string.IsNullOrEmpty(x.Value) || !x.Value.StartsWith("B"));

评论

1赞 lidqy 10/12/2023
短版本将是list.Where(x.Value?.StartsWith("B") != false);
1赞 Olivier Jacot-Descombes 10/12/2023 #2

使用模式匹配,您可以编写:

var result = list.Where(x => x.Value is not ['B', ..]);

该字符串被视为 的列表,并对其应用列表模式。这包括值,因为列表模式隐式测试 。charnullnull

如果还想排除以小写字母“b”开头的字符串,则可以使用模式 。is not ['B' or 'b', ..]


使用以下类型在控制台应用中测试设置:

record class Data(int ID, string Value);

测试:

var list = new List<Data> {
    new(1,"A01"),
    new(2,"B01"),
    new(3,null),
    new(4,""),
    new(5,"A02"),
    new(6,"A02"),
    new(7,"B02"),
    new(8,"B"),
    new(9,"D"),
};

var result = list.Where(x => x.Value is not ['B', ..]);
foreach (var item in result) {
    Console.WriteLine(item);
}
Console.ReadKey();

指纹:

Data { ID = 1, Value = A01 }
Data { ID = 3, Value =  }
Data { ID = 4, Value =  }
Data { ID = 5, Value = A02 }
Data { ID = 6, Value = A02 }
Data { ID = 9, Value = D }

评论

0赞 Narish 10/12/2023
问题,我第一次看到这样的事情。where 子句不应该有吗?我不明白这怎么能假设x.Value?[0].StartsWith()
1赞 Olivier Jacot-Descombes 10/12/2023
@Narish。该模式表示序列不为 null(隐式),从字符 (this is ) 开始,并且可能具有更多元素(由 表示)。因为我们说,我们得到相反的结果。即,要么或不以该序列开头的序列,其中包括一个空序列(空字符串)。请参见: C# 列表模式['B', ..]'B'Value[0]..is notnullB
1赞 Narish 10/12/2023
谢谢你的解释。总是让我感到惊讶的是,列表模式可以如此简洁,同时传达如此多的验证层
0赞 Niels van Mierlo 10/12/2023 #3

谢谢大家的指导。我通过结合答案找到了解决方案:

class Program
{
    record class Data(int ID, string? Value);
    static void Main(string[] args)
    {

        Console.WriteLine("Hello World!");
        var list = new List<Data> {
            new(1,"A01"),
            new(2,"B01"),
            new(3,null),
            new(4,""),
            new(5,"A02"),
            new(6,"A02"),
            new(7,"B02"),
            new(8,"B"),
            new(9,"D"),
        };

        var result = list.Where(x => x.Value == null || (!x.Value.StartsWith("B") && !x.Value.StartsWith("A")));
        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
    }
}