回答:
System.Data.Entity.Design.PluralizationServices.PluralizationServiceもあります。
更新:古い答えは更新に値します。Humanizerもあります:https : //github.com/MehdiK/Humanizer
私はエスペラントのためにそれをすることができます、特別なケースはありません!
string plural(string noun) { return noun + "j"; }
英語の場合、ためのルールに慣れるために有用であろう正規名詞の複数形だけでなく、名詞の不規則複数形。英語の複数形に関するWikipediaの記事全体があり、役立つ情報も含まれている場合があります。
彼らは一般的に完璧ではありませんが、ほとんどのORMはそれに刺し傷があります。キャッスルにはインフレクタークラスがあり、おそらくあなたはそれを思いつくことができます。それを「完全に」行うことは簡単な作業ではありませんが(英語の「ルール」は実際にはルールではありません))、「合理的な推測」アプローチに満足しているかどうかによって異なります。
私は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"));
私は.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でも利用できます。
Railsの複数形化プログラムに基づいて1つにまとめました。私のブログ投稿はこちら、またはgithubのこちらでご覧いただけます
output = Formatting.Pluralization(100, "sausage");
質問は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"
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");
これは、設備の例のように、複数の同等語がないいくつかの単語を説明します。おそらくおわかりのように、Regex
$ 1を使用して簡単に置き換えます。
更新:
サブソニックのが表示されますInflector
Infactはある城のActiveRecordInflector
クラス!
PluralizationServiceクラスの特定の使用法に関するMSDNのドキュメントはそれほど多くないので、基本的な使用法を示すユニットテストクラス(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"));
Singularizeは、「Order_Details」を単数化しません。末尾に「Order_Details」を返しますs
。回避策は何ですか?