Есть ли какой-нибудь алгоритм в С# для сингулярности - множественного числа слова?

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

Ответ 2

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

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

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

Ответ 3

Большинство ORM имеют удар, хотя они, как правило, не идеальны. Я знаю, что у замка есть Inflector Class, который вы, возможно, можете совать. Выполнение этого "отлично" - задача непростая, хотя (английские "правила" на самом деле не являются правилами:)), поэтому это зависит, если вы довольны "разумным угадыванием".

Ответ 4

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

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"));

Ответ 5

Я взбивал один на основе плюрализатора Rails. Вы можете увидеть мое сообщение в блоге здесь или на github here

output = Formatting.Pluralization(100, "sausage"); 

Ответ 6

Я создал небольшую библиотеку для этого в .net(С#), называемом 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.

Ответ 7

Поскольку вопрос был для С#, вот хорошая вариация решения 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"

Ответ 8

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.

Update:
Похоже, Subsonic Inflector infact Замок ActiveRecord Inflector класс!

Ответ 9

Не так много документации из MSDN о конкретном использовании класса PluralizationService, поэтому здесь представлен класс unit test (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
    }
}

Ответ 11

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

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

Singularize не сингулярно "Order_Details" Он возвращает "Order_Details" с s в конце. Какая работа?