使用模式匹配来匹配具有非零下限的数组

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返回数组捕获性分组和非捕获性分组嵌套分组

Chapter 21_3 模式

贪婪模式与非贪婪模式

在 Redshift 中使用正则表达式来获取匹配模式之前的单词

如何在 PHP 中匹配具有共同前缀的单词?

scala 模式匹配以删除某些情况