我有一个C#应用程序,它根据遇到的各种条件创建详细的文本消息。如果出现多次,我必须使用消息中许多单词的复数形式,并确保所有相关的词性对应正确。这是任何语言的危害,但我想知道是否有一个很好的方法来处理这个问题。下面是一个非常简化的示例,其中第一个集合仅用于一次,第二个集合用于多个:
"The letter corresponds properly.\n" +
"It must be capitalized.\n";
"The letters correspond properly.\n" +
"They must be capitalized.\n";
目前我做的事情如下,这是一个真正的痛苦和kluge:
string plural_s = plural ? "s" : "";
string plural_s_negate = plural ? "" : "s";
string plural_they = plural ? "They" : "It";
"The letter" + plural_s + " correspond" + plural_s_negate + " properly.\n" +
plural_they + " must be capitalized.\n";
在这个简化的情况下,显然最好只保留两个文字案例并在它们之间进行选择,但在很多情况下,我的解释很长很多很常见的部分,所以我不想保留两个单独的集合
答案 0 :(得分:2)
Humanizer做了类似这样的事情,但它可能对你的需求有些过分,同时也无法帮助你处理动词。
如果您确切知道要操作的单词,可以使用字典和扩展方法来简化语法:
using System.Text.RegularExpressions;
public static class PluralizeExtensions {
private static Dictionary<string, string> pluralForms = new Dictionary<string, string> {
{ "letter", "letters" },
{ "corresponds", "correspond" },
{ "It", "They" }
};
public static string Pluralize(this string text, bool isPlural) {
if (!isPlural) return text;
var words = Regex.Split(text, @"\b");
for (int i = 0; i < words.Length; i++) {
if (pluralForms.ContainsKey(words[i])) words[i] = pluralForms[words[i]];
}
return string.Join("", words);
}
}
您可以这样使用:
bool plural = WhateverYouDoToDecideIfItsPlural();
var text = ("The letter corresponds properly.\n" +
"It must be capitalized.\n").Pluralize(plural);
请注意,如果您需要这种灵活性,可以扩展此方法以更好地处理大小写。