具有复数奇异的文本语法

时间:2017-05-12 19:26:58

标签: c# grammar

我有一个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";

在这个简化的情况下,显然最好只保留两个文字案例并在它们之间进行选择,但在很多情况下,我的解释很长很多很常见的部分,所以我不想保留两个单独的集合

1 个答案:

答案 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);

请注意,如果您需要这种灵活性,可以扩展此方法以更好地处理大小写。