提问人:Saruhan 提问时间:11/7/2023 更新时间:11/7/2023 访问量:120
C# if 条件格式
C# if condition format
问:
我有这样的情况。
if (data.Data != null && data.Data.Any())
我想像这样改变。
if (data is not { Data: null } && data is { Data: ... })
我们如何检查“数据”中是否有元素,这是这种格式的列表?有什么办法可以做到这一点吗?
答:
如果 type of 是 a 或 a array 或类似的东西,则可以使用新的列表模式:Data
List
if (data is { Data: [_, ..] }) {
用于匹配任何元素,并且匹配其余元素。Null 由模式自动处理(它们不会匹配)。_
..
评论
我以前所见所闻:
public static class ListExtensions
{
public static bool IsNullOrEmpty<T>(this List<T> list)
=> list is null || list.Count == 0;
}
用法:小提琴
List<string> list = null;
Console.WriteLine(list.IsNullOrEmpty()); // true
list = new();
Console.WriteLine(list.IsNullOrEmpty()); // true
list.Add("");
Console.WriteLine(list.IsNullOrEmpty()); // false
你也可以把它和@Sweeper的答案结合起来(我自己点赞):
public static class Extensions
{
public static bool HasData(this WhateverTypeDataIs data)
=> data is { Data: [_, ..] };
}
这使得开发人员体验更具可读性:
if (data.HasData())
{
// ...
}
在 C# 中,与属性模式结合使用的关键字可用于 null 检查,但它不是用于检查集合内容(如列表是否为空)而设计的。is
您的第一行代码:
if (data.Data != null && data.Data.Any())
这是检查是否不为空并且具有任何元素。Data
Data
如果要使用模式匹配来确保不为空,可以这样写:is
Data
if (data is { Data: {} } && data.Data.Any())
下面使用属性模式来匹配非 null 属性。但是,不能使用模式匹配来检查是否有任何元素。仍然需要该方法来检查集合是否至少有一个元素。{ Data: {} }
Data
Data
Any()
因此,等效的检查和 属性模式将是:is
if (data is { Data: {} dataItems } && dataItems.Any())
这将分配给 if is not null,然后使用该方法检查列表中是否有任何项目。但是,请注意,此代码更冗长,并且不会比您的原始条件增加任何好处;完成同样的事情只是不同的语法。Data
dataItems
Data
Any()
当您想要执行更复杂的类型检查和分解时,带有模式的关键字更有用。对于简单的 null 检查和检查集合是否包含项,和 检查更习惯和更清晰。is
!= null
.Any()
评论
if(data.Data?.Any() ?? false)
if (data.Data?.Any() == true)
== true
?
.