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