尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Humanizer Plurality 枚举详解:如何在 .NET 文本变形中表达单数、复数与未知复数性
开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载本文以 Humanizer 公共 API 中的Plurality枚举为切入点系统讲解其三个成员Singular、Plural、CouldBeEither的定义、数值与语义并结合仓库源码Plurality.cs、Vocabulary.cs与测试用例说明 Humanizer 是如何在词形变换复数化/单数化中处理未知复数性这一场景的。读完本文你将掌握该枚举的准确含义、底层调用机制以及在实际代码中如何规避双重复数化或错误单数化。一、Plurality枚举是什么Plurality是 Humanizer 定义在Humanizer命名空间下的一个公共枚举位于 src/Humanizer/Plurality.cs。它的作用正如其 XML 文档注释所述为 Humanizer 提供一个关于某个词是单数、复数还是复数性未知的提示Provides hint for Humanizer as to whether a word is singular, plural or with unknown plurality。从源码看其完整定义如下namespace Humanizer; /// summary /// Provides hint for Humanizer as to whether a word is singular, plural or with unknown plurality /// /summary public enum Plurality { /// summary /// The word is singular /// /summary Singular, /// summary /// The word is plural /// /summary Plural, /// summary /// I am unsure of the plurality /// /summary CouldBeEither }该枚举被纳入 Humanizer 的公共 API 契约在 PublicApiApprovalTest.Approve_Public_Api.DotNet8_0.verified.txt 等 API 验收快照中均有登记说明它是库面向使用者的稳定公共类型之一。三个成员的语义与取值官方 API 文档Humanizer.Plurality.md对每个字段给出了明确说明整理如下成员数值语义说明Plurality.Singular0该词是单数The word is singularPlurality.Plural1该词是复数The word is pluralPlurality.CouldBeEither2无法确定词的复数性I am unsure of the plurality值得注意的是由于枚举默认从0开始按声明顺序递增Singular同时是default(Plurality)的值CouldBeEither是一个三态设计中用于表达不确定性的特殊状态——它既不代表单数也不代表复数而是告诉下游逻辑我不确定请自行判断或采取兜底策略。二、从源码看未知复数性是如何被处理的Plurality枚举本身是一个轻量的状态标记而 Humanizer 真正处理复数性未知的核心逻辑集中在词形变换引擎 Vocabulary.cs 中。在 Vocabulary.cs 的Singularize方法里源码直接以注释点明了这一设计意图// the Plurality is unknown so we should check all possibilities这句注释所在的分支对应Singularize(string? word, bool inputIsKnownToBePlural true, bool skipSimpleWords false)方法中inputIsKnownToBePlural为false的情形当调用者不确定输入词是否为复数时引擎不会直接套用单数化规则而是先尝试按复数规则反向推导ApplyRules(plurals, ...)再与单数化结果相互印证从而避免把本身就正确的单词改错。对称地Pluralize 方法 也提供了bool inputIsKnownToBeSingular true参数当调用者不确定输入词是否为单数时同样会先做一轮按复数规则处理→再按单数规则回推的交叉校验见 Vocabulary.cs防止把已经是复数的词再次复数化。从源码结构可以推断Plurality.CouldBeEither所代表的不确定概念在实际调用链中正是通过inputIsKnownToBeSingular: false/inputIsKnownToBePlural: false这两个布尔参数来落地的。面向使用者的扩展方法入口普通开发者通常不会直接接触Vocabulary而是使用 InflectorExtensions.cs 中的字符串扩展方法public static string? Pluralize(this string? word, bool inputIsKnownToBeSingular true) Vocabularies.Default.Pluralize(word, inputIsKnownToBeSingular); public static string Singularize(this string word, bool inputIsKnownToBePlural true, bool skipSimpleWords false) Vocabularies.Default.Singularize(word, inputIsKnownToBePlural, skipSimpleWords);这两个扩展方法直接透传是否已知复数性的标志位到Vocabulary引擎Vocabularies.Default为默认词汇表实例定义于 Vocabularies.cs。三、实战如何在不确定复数性时安全调用对应Plurality三态中的确定与不确定两类场景代码写法应做如下区分。1. 确定输入是单数 → 默认行为默认参数inputIsKnownToBeSingular: true表示信任输入直接套用复数化规则person.Pluralize(); // people cat.Pluralize(); // cats box.Pluralize(); // boxes man.Pluralize(); // men meter per second.Pluralize(); // meters per second PERSON.Pluralize(); // PEOPLE这些示例正是 InflectorExtensions.cs 文档注释中官方给出的行为。2. 不确定输入是单数还是复数 → 显式声明当输入可能已经是复数时应把标志位设为false相当于告诉引擎复数性未知此时引擎会执行交叉校验以避免双重复数化cats.Pluralize(inputIsKnownToBeSingular: false); // cats避免变成 catses person.Pluralize(inputIsKnownToBeSingular: false); // people单数化方向同理people.Singularize(); // person cats.Singularize(); // cat boxes.Singularize(); // box meters per second.Singularize(); // meter per second person.Singularize(inputIsKnownToBePlural: false); // person避免错误改写其中 person 在inputIsKnownToBePlural: false下保持原样正是 InflectorExtensions.cs 注释强调的avoids incorrect singularization。3. 跳过简单词skipSimpleWordsSingularize还额外提供skipSimpleWords参数用于跳过以 s 结尾的简单词的单数化。测试用例 InflectorTests.cs 给出了典型场景tires.Singularize(skipSimpleWords: true); // tires body.Singularize(skipSimpleWords: true); // bodies规则仍生效 traxxas.Singularize(skipSimpleWords: true); // traxxas四、测试如何验证未知复数性行为Humanizer 的测试套件专门覆盖了与CouldBeEither语义对应的未知复数性/单数性分支见 tests/Humanizer.Tests/InflectorTests.cs[Theory] [ClassData(typeof(PluralTestSource))] public void PluralizeWordsWithUnknownPlurality(string singular, string plural) { Assert.Equal(plural, plural.Pluralize(false)); Assert.Equal(plural, singular.Pluralize(false)); } [Theory] [ClassData(typeof(PluralTestSource))] public void SingularizeWordsWithUnknownSingularity(string singular, string plural) { Assert.Equal(singular, singular.Singularize(false)); Assert.Equal(singular, plural.Singularize(false)); }这两组测试的断言逻辑可以概括为未知复数性无论是把单数还是复数输入传给Pluralize(false)结果都必须是正确的复数形式未知单数性无论是把复数还是单数输入传给Singularize(false)结果都必须是正确的单数形式。也就是说不确定绝不意味着碰运气而是要求引擎在双向校验后仍然给出确定且正确的词形。此外InflectorTests.cs 中的SingularizeDoesNotRewriteUnrelatedWordsEndingInMen测试还验证了在inputIsKnownToBePlural: false下abdomen、specimen、Pacmen等以men结尾但与man/men无关的词不会被误改写——这正是未知复数性分支采用交叉校验而非盲目套规则的原因。五、使用建议与边界说明能用确定就不要用不确定默认参数已覆盖大多数输入为单数/复数的确定场景性能与可预期性最好只有数据来源不可控如用户输入、外部文本时才需要把inputIsKnownToBe*置为false。Plurality枚举与布尔参数的关系从当前仓库源码结构看Plurality枚举在公共 API 层面承担复数性三态的语义定义而词形变换 API 目前通过inputIsKnownToBeSingular/inputIsKnownToBePlural两个布尔参数表达同一概念Plurality.CouldBeEither对应的正是这两个参数为false时的未知状态。不规则词与不可数词Vocabulary内置了不规则词与不可数词表如meter per second在 InflectorTests.cs 中被验证为不可数这些词的未知复数性处理同样走上述交叉校验路径。大小写保持引擎在套用规则后会通过MatchUpperCase恢复输入的大小写风格如PERSON.Pluralize() PEOPLE该行为由 Vocabulary.cs 中的MatchUpperCase(word, result)保证。如果你需要自定义词形规则或注册新的词汇表可进一步阅读 Vocabulary.cs 与 Vocabularies.cs 的源码实现并结合 InflectorTests.cs 的测试模式来验证自定义行为。赞分享开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载相关推荐Hindsight Go 客户端实战从 Retain/Recall/Reflect 到 Nullable 字段与错误处理的完整指南Hindsight Go 客户端实战从 Retain/Recall/Reflect 到 Nullable 字段与错误处理的完整指南 本文基于 Hindsigh开发工具Humanizer 中 GrammaticalGender 枚举详解跨文化控制数字词性与序数词性形的机制Humanizer 中 GrammaticalGender 枚举详解跨文化控制数字词性与序数词性形的机制 本篇围绕 Humanizer 仓库文档 Humani开发工具VictoriaMetrics 故障排查实战指南查询异常、摄入缓慢、慢查询与集群不稳定的系统性定位方法VictoriaMetrics 故障排查实战指南查询异常、摄入缓慢、慢查询与集群不稳定的系统性定位方法 本文基于 VictoriaMetrics 官方故障排查开发工具上一篇vscode-drawio革命性插件让SVG/PNG文件直接支持Draw.io编辑的终极指南下一篇如何从零开始打造你的Magic ePaper电子纸硬件完整DIY指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

NixOS 部署 Taskserver:Taskwarrior 2 同步服务的声明式 CA 管理与 nixos-taskserver 工具详解

NixOS 部署 Taskserver:Taskwarrior 2 同步服务的声明式 CA 管理与 nixos-taskserver 工具详解

包管理器操作系统 【免费下载链接】nixpkgs Nix Packages collection & NixOS 项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs 点击查看 免费下载 本文基于 nixpkgs 仓库中的 Taskserver 模块文档 与 模块实现,系统讲解如何在 NixOS 上…

📅 2026/9/25 5:26:15
ESPnet2 MultiMed-ST 英德语音翻译 Recipe:基于 OWSM v4 small 微调的完整实战指南

ESPnet2 MultiMed-ST 英德语音翻译 Recipe:基于 OWSM v4 small 微调的完整实战指南

人工智能语音音频深度学习NLP 【免费下载链接】espnet End-to-End Speech Processing Toolkit 项目地址: https://gitcode.com/gh_mirrors/es/espnet 点击查看 免费下载 本篇技术指南以 ESPnet 仓库中的 egs2/multimed_st/s2t1/README.md 为主线,系统讲…

📅 2026/9/25 5:21:15
PaddleSpeech 实战:基于 CSMSC 语料训练与部署 VITS 端到端语音合成模型

PaddleSpeech 实战:基于 CSMSC 语料训练与部署 VITS 端到端语音合成模型

人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword…

📅 2026/9/25 5:21:15
MORE NEWS

更多资讯

📰

ZCode静默上传代码库与git历史:AI编程工具的数据安全风险与防护

1. 事件背景与核心争议拆解1.1 从一条爆料说起:ZCode 到底做了什么最近开发者圈子里炸了锅,起因是有用户在对智谱 ZCode 这款 AI 编程助手做网络行为分析时,发现它在运行过程中存在静默上传整个代码库的行为,而且不只是当前工作目…

📰

Atlas 300V 24G推理卡部署YOLO实战:环境搭建、模型转换与调优

1. 先说清楚:Atlas 300V 24G是不是一张“运算加速卡”看到“atlas部署yolo”和“atlas 300v 24g 是运算加速卡吗”这两个热搜词,我就知道大家卡在同一个地方了。直接给结论:是,但准确说是AI推理加速卡,不是通用GPU&…

📰

5G边缘计算与AI推理部署实战:从UPF下沉到模型压缩的完整技术栈

1. 从基站到边缘节点:为什么5G需要把算力“下沉”1.1 一个真实的延迟困境去年我参与了一个车联网路侧感知项目,现场部署了一套基于摄像头的行人检测系统。算法本身在服务器上跑得挺好,单帧推理延迟稳定在30毫秒左右。但当我们把摄像头装到路口…

📰

AI编程工具使用技巧——Cursor 生成 Java 架构思维导图:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Hermes Agent 完整指南:从安装到精通,配 TaoToken 统一 Key 的 config.toml 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

immudb gRPC 协议深度指南:schema.proto 消息模型、ImmuService 服务与可验证性设计全解

数据库安全后端 【免费下载链接】immudb immudb - immutable database based on zero trust, SQL/Key-Value/Document model, tamperproof, data change history 项目地址: https://gitcode.com/gh_mirrors/im/immudb 点击查看 免费下载 immudb 对外暴露的 gRPC 与…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬