使用模式匹配来匹配具有非零下限的数组
Posted
技术标签:
【中文标题】使用模式匹配来匹配具有非零下限的数组【英文标题】:Using pattern matching to match an array with a non-zero lower bound 【发布时间】:2022-01-11 11:44:03 【问题描述】:我正在编写通过 COM 自动化调用 Excel 宏的代码。需要处理不同的返回类型,模式匹配非常适合:
var result = ExcelApp.Run("MyMacro", ...);
return result switch
object[,] array => ...,
string message => ...,
_ => throw new MyException("...")
;
因为它是 Excel,所以数组的下限是 1 而不是 0,这在 .NET 中得到完全支持。然而,令我惊讶的是,我发现当我尝试对下限为 1 的一维数组执行模式匹配时,模式不匹配。
详细来说,创建一个下界为 1 的 2×2 数组将匹配模式 object[,]
,即以下语句为 true
:
Array.CreateInstance(typeof(object), new[] 2, 2 , new[] 1, 1 ) is object[,] array
但是,创建一个下限为 1(不正常)的 1×2 数组(只是一个包含两个元素的普通数组)将不匹配模式 object[]
,即以下语句为false
:
Array.CreateInstance(typeof(object), new[] 2 , new[] 1 ) is object[] array
这让我很惊讶,但是有没有一种模式可以用来匹配具有非零下限的一维数组?
【问题讨论】:
【参考方案1】:奇怪的是,模式匹配数组的规则对于一维数组是不同的,但因为数组有一个Rank
属性,它仍然是可能的:
return result switch
Array Rank: 1 array => ...,
// ... other cases
;
如果您想将基于 1 的数组(在上面的 array
中匹配)转换为普通的基于 0 的数组,可以这样做:
array.Cast<object>().ToArray()
由于下限不作为属性公开,而是需要方法调用 (GetLowerBound()
),因此您无法对特定下限进行模式匹配。
【讨论】:
以上是关于使用模式匹配来匹配具有非零下限的数组的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript正则表达式模式匹配——使用exec返回数组捕获性分组和非捕获性分组嵌套分组