Відповіді:
У вас також є System.Data.Entity.Design.PluralizationServices.PluralizationService .
ОНОВЛЕННЯ : Стара відповідь заслуговує на оновлення. Зараз також є Гуманізатор: https://github.com/MehdiK/Humanizer
Я можу це зробити на есперанто, без особливих випадків!
string plural(string noun) { return noun + "j"; }
Для англійської мови було б корисно ознайомитись з правилами регулярного множини іменників , а також з неправильними множинами іменників . Є ціла стаття у Вікіпедії на англійській множині , яка також може мати корисну інформацію.
Більшість ORM мають удар, хоча вони, як правило, не є ідеальними. Я знаю, що в замку є клас Inflector, про який ви, мабуть, можете повозитися. Зробити це "ідеально" - це непросте завдання (англійська "правила" насправді не правила :)), тому це залежить, чи задоволений ви підходом "розумної здогадки".
Я обдурив 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.
Я збив один разом на основі плюралізатора Rails. Ви можете побачити мою публікацію в блозі тут або на 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.
Оновлення:
Здається, що Subsonic Inflectorє непорушнимInflector класом Castle ActiveRecord !
Немало документації від 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
Використання прикладної бази даних Northwind Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize не Singularize "Order_Details" Він повертає "Order_Details" з sкінцем. Яка робота навколо?