在c#中有任何算法可以单数化 - 复数一个单词吗?

时间:2009-01-24 07:42:09

标签: c# algorithm

c#中是否有任何算法可以单数化 - 复数一个单词(英文)或存在.net库来执行此操作(也可能使用不同的语言)?

11 个答案:

答案 0 :(得分:178)

您还拥有System.Data.Entity.Design.PluralizationServices.PluralizationService

更新:旧答案值得更新。现在还有Humanizer:https://github.com/MehdiK/Humanizer

答案 1 :(得分:16)

我可以为世界语做,没有特殊情况!

string plural(string noun) { return noun + "j"; }

对于英语,熟悉Regular Plurals of Nouns以及Irregular Plurals of Nouns的规则会很有用。 English plural上有一篇完整的维基百科文章,也可能有一些有用的信息。

答案 2 :(得分:14)

大多数ORM都对它有所刺激,尽管它们通常并不完美。我知道Castle有Inflector Class你可能会四处寻找。尽管这样做“完美”并不是一件容易的事(英语“规则”并不是真正的规则:)),所以这取决于你是否对“合理的猜测”方法感到满意。

答案 3 :(得分:12)

我在Java中作弊 - 我希望能够为“有某些东西”生成正确的字符串,所以我写了这篇文章。有点重载的实用方法:

static public String pluralize(int val, String sng) {
    return pluralize(val,sng,(sng+"s"));
    }

static public String pluralize(int val, String sng, String plu) {
    return (val+" "+(val==1 ? sng : plu)); 
    }

像这样调用

System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));

答案 4 :(得分:9)

我在.net(C#)中创建了一个小型库,名为Pluralizer(不出所料)。

它的意思是使用完整的句子,比如String.Format。

它基本上是这样的:

var target = new Pluralizer();
var str = "There {is} {_} {person}.";

var single = target.Pluralize(str, 1);
Assert.AreEqual("There is 1 person.", single);

// Or use the singleton if you're feeling dirty:
var several = Pluralizer.Instance.Pluralize(str, 47);
Assert.AreEqual("There are 47 people.", several);

它还可以做更多的事情。阅读更多相关信息on my blog。它也可以在NuGet中使用。

答案 5 :(得分:8)

我根据Rails复数器一起鞭打了一个。您可以看到我的博文hereon github here

output = Formatting.Pluralization(100, "sausage"); 

答案 6 :(得分:4)

问题在于C#,这是Software Monkey解决方案的一个很好的变体(再次有点像“作弊”,但对我来说真的是最实用和可重复使用的方式):

    public static string Pluralize(this string singularForm, int howMany)
    {
        return singularForm.Pluralize(howMany, singularForm + "s");
    }

    public static string Pluralize(this string singularForm, int howMany, string pluralForm)
    {
        return howMany == 1 ? singularForm : pluralForm;
    }

用法如下:

"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"

"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"

答案 7 :(得分:3)

Subsonic 3有一个Inflector课程,将Person转变为People让我印象深刻。我偷看了源头,发现它自然会用硬编码列表作弊但这真的是用英语做的唯一方式以及人类如何做到这一点 - 我们记住每个单词的单数和复数而不仅仅是应用规则。由于没有男性化/女性化(/中性)添加到混合中,因此更加简单。

这是一个片段:

AddSingularRule("^(ox)en", "$1");
AddSingularRule("(vert|ind)ices$", "$1ex");
AddSingularRule("(matr)ices$", "$1ix");
AddSingularRule("(quiz)zes$", "$1");

AddIrregularRule("person", "people");
AddIrregularRule("man", "men");
AddIrregularRule("child", "children");
AddIrregularRule("sex", "sexes");
AddIrregularRule("tax", "taxes");
AddIrregularRule("move", "moves");

AddUnknownCountRule("equipment");

它解释了一些不具有多个等价物的词,如设备示例。正如您可能会告诉它使用$ 1进行简单的Regex替换。

<强>更新
看起来亚力学的Inflector实际上是Castle ActiveRecord Inflector类!

答案 8 :(得分:2)

来自MSDN的关于PluralizationService类的具体用法的文档不多,所以这里是一个单元测试类(NUnit)来显示基本用法。请注意底部的奇怪测试用例,表明当涉及非标准复数形式时,服务并不完美。

[TestFixture]
public class PluralizationServiceTests
{
    [Test]
    public void Test01()
    {
        var service = PluralizationService.CreateService(CultureInfo.CurrentCulture);

        Assert.AreEqual("tigers", service.Pluralize("tiger"));
        Assert.AreEqual("processes", service.Pluralize("process"));
        Assert.AreEqual("fungi", service.Pluralize("fungus"));

        Assert.AreNotEqual("syllabi", service.Pluralize("syllabus")); // wrong pluralization
    }
}

答案 9 :(得分:1)

此页面显示如何使用PluralizationService System.Data.Entity(.NET Framework 4.0)

http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html

答案 10 :(得分:1)

使用Microsoft的Northwind示例数据库:

 System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));

Singularize不会Singularize&#34; Order_Details&#34; 它返回&#34; Order_Details&#34;最后使用s。有什么工作?

相关问题