.net C# if条件格式

qyswt5oh  于 2023-11-20  发布在  .NET
关注(0)|答案(3)|浏览(120)

我有这样的情况。
第一个月
我想这样改变。
if (data is not { Data: null } && data is { Data: ... })
我们如何检查'Data'中是否有这种格式的元素?有什么方法可以做到这一点吗?

ecfdbz9o

ecfdbz9o1#

如果Data的类型是List或数组或类似的东西,则可以使用新的list patterns

if (data is { Data: [_, ..] }) {

字符串
使用_匹配任何元素,..匹配其余元素。空值由模式自动处理(它们不会被匹配)。

xpcnnkqh

xpcnnkqh2#

我以前看过和做过的事情:

public static class ListExtensions
{
    public static bool IsNullOrEmpty<T>(this List<T> list)
       => list is null || list.Count == 0;
}

字符串
用法:Fiddle

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()) 
{
    // ...
}

oewdyzsn

oewdyzsn3#

在C#中,is关键字结合属性模式可用于空值检查,但它不是设计来检查集合内容的,比如列表是否为空。
你的第一行代码:

if (data.Data != null && data.Data.Any())

字符串
这是检查Data是否不为null以及Data是否有任何元素。
如果你想对is使用模式匹配来确保Data不为null,你可以这样写:

if (data is { Data: {} } && data.Data.Any())


这里{ Data: {} }使用属性模式来匹配非空的Data属性。但是,您不能使用模式匹配来检查Data是否有任何元素。Any()方法仍然需要检查集合是否至少有一个元素。
因此,is和属性模式的等效检查是:

if (data is { Data: {} dataItems } && dataItems.Any())


如果Data不为null,则将Data赋值给dataItems,然后使用Any()方法检查列表中是否有任何项。但是,请注意,这段代码更冗长,并且没有比原始条件增加任何好处;它只是完成相同任务的不同语法。
当你想做更复杂的类型检查和分解时,带模式的is关键字更有用。对于简单的null检查和检查集合是否有项,!= null.Any()检查更惯用和更清晰。

相关问题