我有这样的情况。第一个月我想这样改变。if (data is not { Data: null } && data is { Data: ... })的我们如何检查'Data'中是否有这种格式的元素?有什么方法可以做到这一点吗?
if (data is not { Data: null } && data is { Data: ... })
ecfdbz9o1#
如果Data的类型是List或数组或类似的东西,则可以使用新的list patterns:
Data
List
if (data is { Data: [_, ..] }) {
字符串使用_匹配任何元素,..匹配其余元素。空值由模式自动处理(它们不会被匹配)。
_
..
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()) { // ... }
型
oewdyzsn3#
在C#中,is关键字结合属性模式可用于空值检查,但它不是设计来检查集合内容的,比如列表是否为空。你的第一行代码:
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和属性模式的等效检查是:
{ Data: {} }
Any()
if (data is { Data: {} dataItems } && dataItems.Any())
型如果Data不为null,则将Data赋值给dataItems,然后使用Any()方法检查列表中是否有任何项。但是,请注意,这段代码更冗长,并且没有比原始条件增加任何好处;它只是完成相同任务的不同语法。当你想做更复杂的类型检查和分解时,带模式的is关键字更有用。对于简单的null检查和检查集合是否有项,!= null和.Any()检查更惯用和更清晰。
dataItems
!= null
.Any()
3条答案
按热度按时间ecfdbz9o1#
如果
Data
的类型是List
或数组或类似的东西,则可以使用新的list patterns:字符串
使用
_
匹配任何元素,..
匹配其余元素。空值由模式自动处理(它们不会被匹配)。xpcnnkqh2#
我以前看过和做过的事情:
字符串
用法:Fiddle
型
你也可以把这个合并和@Sweeper的回答结合起来(我自己也投了赞成票):
型
这使得开发人员的体验更加可读:
型
oewdyzsn3#
在C#中,
is
关键字结合属性模式可用于空值检查,但它不是设计来检查集合内容的,比如列表是否为空。你的第一行代码:
字符串
这是检查
Data
是否不为null以及Data
是否有任何元素。如果你想对
is
使用模式匹配来确保Data
不为null,你可以这样写:型
这里
{ Data: {} }
使用属性模式来匹配非空的Data
属性。但是,您不能使用模式匹配来检查Data
是否有任何元素。Any()
方法仍然需要检查集合是否至少有一个元素。因此,
is
和属性模式的等效检查是:型
如果
Data
不为null,则将Data
赋值给dataItems
,然后使用Any()
方法检查列表中是否有任何项。但是,请注意,这段代码更冗长,并且没有比原始条件增加任何好处;它只是完成相同任务的不同语法。当你想做更复杂的类型检查和分解时,带模式的
is
关键字更有用。对于简单的null检查和检查集合是否有项,!= null
和.Any()
检查更惯用和更清晰。