Есть ли какой-нибудь алгоритм в C# для единственного числа - множественного числа слова?
Есть ли какой-нибудь алгоритм в C# для сингулярности - множественного числа слова (на английском языке) или для этого существует библиотека.net (может быть также на разных языках)?
11 ответов
У вас также есть http://msdn.microsoft.com/en-us/library/system.data.entity.design.pluralizationservices.pluralizationservice.aspx.
ОБНОВЛЕНИЕ: Старый ответ заслуживает обновления. Там теперь также Humanizer: https://github.com/MehdiK/Humanizer
Я могу сделать это для эсперанто, без особых случаев!
string plural(string noun) { return noun + "j"; }
Для английского языка было бы полезно ознакомиться с правилами для обычного множественного числа существительных, а также для неправильного множественного числа существительных. Существует целая статья в Википедии об английском множественном числе, которая также может содержать некоторую полезную информацию.
У большинства ORM есть удар, хотя они, как правило, не идеальны. Я знаю, что у Касла есть класс Inflector, который вы, вероятно, можете осмотреть. Делать это "идеально" - непростая задача (английские "правила" на самом деле не являются правилами:)), поэтому все зависит от того, довольны ли вы подходом "разумного предположения".
Я обманул в 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. Вы можете увидеть мой пост здесь или на 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"
Дозвуковой 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
это действительно замок ActiveRecord Inflector
учебный класс!
В 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
}
}
Используя пример базы данных Microsoft Northwind:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize не Singularize "Order_Details" Он возвращает "Order_Details" с s
в конце. Что обходится?
Эта страница показывает, как использовать PluralizationService
из System.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html