Есть ли какой-нибудь алгоритм в c # для придания единственного числа - множественного числа слова? - PullRequest
102 голосов
/ 24 января 2009

Существует ли какой-либо алгоритм в c # для сингулярности - множественное число слова (на английском языке) или для этого существует библиотека .net (может быть также на разных языках)?

Ответы [ 11 ]

178 голосов
/ 09 марта 2010

У вас также есть System.Data.Entity.Design.PluralizationServices.PluralizationService .

ОБНОВЛЕНИЕ : Старый ответ заслуживает обновления. Там теперь также Humanizer: https://github.com/MehdiK/Humanizer

16 голосов
/ 24 января 2009

Я могу сделать это для эсперанто, без особых случаев!

string plural(string noun) { return noun + "j"; }

Для английского языка было бы полезно ознакомиться с правилами для Правильное множественное число существительных , а также Нерегулярное множественное число существительных . Есть целая статья в Википедии о английском множественном числе , в которой тоже может быть некоторая полезная информация.

14 голосов
/ 24 января 2009

У большинства ОРМ есть удар, хотя они, как правило, не идеальны. Я знаю, что у Касла есть класс инфлектора , который вы, вероятно, можете осмотреть. Выполнить это «идеально» не так просто (английские «правила» на самом деле не являются правилами :)), поэтому все зависит от того, доволен ли вы подходом «разумного предположения».

12 голосов
/ 24 января 2009

Я обманул в Java - я хотел, чтобы была возможность создать правильную строку для «Было что-то (s)», поэтому я написал следующее. маленький перегруженный метод утилит:

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"));
9 голосов
/ 04 марта 2011

Я создал крошечную библиотеку для этого в .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.

8 голосов
/ 12 января 2010

Я взбил одну из них на основе мультипликатора Rails. Вы можете увидеть мой пост здесь или на github здесь

output = Formatting.Pluralization(100, "sausage"); 
4 голосов
/ 08 февраля 2012

Поскольку вопрос был о 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 голосов
/ 28 августа 2009

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 на самом деле Castle ActiveRecord Inflector класс!

2 голосов
/ 24 сентября 2014

Не так много документации от 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
    }
}
1 голос
/ 03 февраля 2015

Использование базы данных Microsoft Northwind:

 System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));

Singularize не использует Singularize "Order_Details" Возвращает Order_Details с s в конце. Что обходится?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...