多元化 – 单一化

在C#中是否有任何algorithmsingularize – 复数词(英语)或确实存在一个.net库来做到这一点(也可能在不同的语言)?

你也有System.Data.Entity.Design.PluralizationServices.PluralizationService 。

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

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

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

对英语来说,熟悉常规复数名词的规则以及不规则复数名词是有用的 。 有一个关于英文复数的整个维基百科文章,也可能有一些有用的信息。

大多数ORM都有刺,尽pipe它们一般都不完美。 我知道城堡有Inflector Class,你大概可以四处游荡 。 尽pipe做得“完美”并不是一件容易的事情(英语“规则”并不是真正的规则:)),所以这取决于你是否满意于“合理的猜测”方法。

我在Java中作弊 – 我想能够为“有一些东西”产生一个正确的string,所以我写了foll。 一些重载的实用程序方法:

 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")); 

我在.net(C#)中创build了一个小图书馆,称为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); 

它也可以做更多的事情。 在我的博客上阅读更多。 NuGet也有这个function。

我基于Rails多元化器一起鞭打了一个。 你可以在这里看到我的博客文章,或者在这里看到github

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

至于C#的问题,这里是Software Monkey的解决scheme的一个很好的变种(再次是一个“作弊”,但对我来说真的是最实际和可重用的方式):

  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" 

Subsonic 3有一个Inflector类, Inflector印象深刻。 我偷看了源头,发现它自然会用硬编码列表作一点点的欺骗,但这是英文的唯一方法,人类是如何做的 – 我们记住每个单词的单数和复数,而不仅仅是一个规则。 由于没有男性化/女性化(/中性)的join,混合起来要简单得多。

这是一个片段:

 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"); 

它说明了一些没有复数等值的词,如设备例子。 正如你可能会告诉它一个简单的正则Regexreplace使用$ 1。

更新:
看来Subsonic的Inflector就是Castle ActiveRecord Inflector类!

MSDN上没有太多关于PluralizationService类的具体用法的文档,所以这里是一个unit testing类(NUnit)来显示基本的用法。 注意底部奇怪的testing用例,说明非标准复数forms的服务并不完美。

 [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 } } 

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

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

使用Microsoft的Northwind示例数据库:

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

Singularize不Singularize“Order_Details”它结束时返回“Order_Details”与s 。 什么是工作?