提问人:Niels van Mierlo 提问时间:10/11/2023 最后编辑:Francis DucharmeNiels van Mierlo 更新时间:10/12/2023 访问量:84
具有特定 “where” “is null” 的 C# lambda 表达式
c# lambda expression with specific "where" "is null"
问:
有人可以告诉我如何创建一个 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 值的行
提前致谢。
答:
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', ..]);
该字符串被视为 的列表,并对其应用列表模式。这包括值,因为列表模式隐式测试 。char
null
null
如果还想排除以小写字母“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 not
null
B
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();
}
}
评论
.Where(x => x.Value == null || !x.Value.StartsWith("B"))