C# if 条件格式

C# if condition format

提问人:Saruhan 提问时间:11/7/2023 更新时间:11/7/2023 访问量:120

问:

我有这样的情况。

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

我想像这样改变。

if (data is not { Data: null } && data is { Data: ... })

我们如何检查“数据”中是否有元素,这是这种格式的列表?有什么办法可以做到这一点吗?

C# .NET IF- .net-core 条件语句

评论

5赞 Zohar Peled 11/7/2023
我建议像这样简化:if(data.Data?.Any() ?? false)
1赞 Good Night Nerd Pride 11/7/2023
或。if (data.Data?.Any() == true)
0赞 Zohar Peled 11/7/2023
@GoodNightNerdPride 我通常不喜欢,但它是(极少数)有价值的用例之一。我仍然觉得我的建议更具可读性,因为它更难出错 - 在您的建议中,人们很容易忽略之前== true?.

答:

7赞 Sweeper 11/7/2023 #1

如果 type of 是 a 或 a array 或类似的东西,则可以使用新的列表模式DataList

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

用于匹配任何元素,并且匹配其余元素。Null 由模式自动处理(它们不会匹配)。_..

评论

0赞 Zohar Peled 11/7/2023
值得一提的是,仅从 c# 11 开始支持列表模式(这是撰写此注释时发布的最新版本)
1赞 Fildor 11/7/2023 #2

我以前所见所闻:

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()) 
{
    // ...
}
-1赞 Black_sky 11/7/2023 #3

在 C# 中,与属性模式结合使用的关键字可用于 null 检查,但它不是用于检查集合内容(如列表是否为空)而设计的。is

您的第一行代码:

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

这是检查是否不为空并且具有任何元素。DataData

如果要使用模式匹配来确保不为空,可以这样写:isData

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

下面使用属性模式来匹配非 null 属性。但是,不能使用模式匹配来检查是否有任何元素。仍然需要该方法来检查集合是否至少有一个元素。{ Data: {} }DataDataAny()

因此,等效的检查和 属性模式将是:is

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

这将分配给 if is not null,然后使用该方法检查列表中是否有任何项目。但是,请注意,此代码更冗长,并且不会比您的原始条件增加任何好处;完成同样的事情只是不同的语法。DatadataItemsDataAny()

当您想要执行更复杂的类型检查和分解时,带有模式的关键字更有用。对于简单的 null 检查和检查集合是否包含项,和 检查更习惯和更清晰。is!= null.Any()

评论

1赞 Fildor 11/7/2023
Gibbiddy 还不知道列表模式,但似乎......