Answers:
您还具有System.Data.Entity.Design.PluralizationServices.PluralizationService。
更新:旧答案值得更新。现在也有Humanizer:https : //github.com/MehdiK/Humanizer
尽管大多数ORM并不完美,但大多数情况下都是如此。我知道Castle有它的Inflector Class,您可能可以在周围翻阅。不过,“完美地”做到这一点并非易事(英语“规则”并不是真正的规则:)),因此这取决于您是否对“合理的猜测”方法感到满意。
我用Java作弊-我希望能够为“有n个东西”生成正确的字符串,所以我写了这篇文章。很少重载的实用方法:
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#)中为此创建了一个微型库,称为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中也可用。
由于问题是针对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"
亚音速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");
像设备示例一样,它说明了一些单词不具有多个等效项。如您所知,它可以Regex
使用$ 1 进行简单替换。
更新:
看来Subsonic Inflector
确实是Castle ActiveRecordInflector
类!
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
}
}
这个页面展示如何使用PluralizationService
的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"));
单数化不单数化“ Order_Details”,它以“ s
。”结尾返回“ Order_Details” 。解决方法是什么?