Это вопрос, а не ответ на вопрос ... но Pluralize () и Singularize () работают только со словарными словами. Есть способ добавить слова, используя ICustomPluralizationMapping.AddWord, но по крайней мере для меня это было не очень хорошим решением, когда у вас может быть много нереальных слов, таких как кодовые имена.

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

Ответы на вопрос(11)

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

 Ronnie24 янв. 2009 г., 09:02
По вашему предложению я искал "Inflector" и нашел этоandrewpeters.net/inflectornet это должно быть в основном то же самое, что замок
 David Pfeffer17 февр. 2010 г., 19:40
На самом деле это не то же самое, это идентично.

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

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

 tordal19 февр. 2015 г., 19:22
Это вопрос, а не ответ на вопрос ... но Pluralize () и Singularize () работают только со словарными словами. Есть способ добавить слова, используя ICustomPluralizationMapping.AddWord, но по крайней мере для меня это было не очень хорошим решением, когда у вас может быть много нереальных слов, таких как кодовые имена.

вот хороший вариант решения 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"
Решение Вопроса

System.Data.Entity.Design.PluralizationServices.PluralizationService.

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

 jscharf19 сент. 2010 г., 06:49
+1 За решение в рамках.
 merlinbeard30 мар. 2013 г., 16:43
Я могу догадаться, как это было добавлено. Тестировщик отправил сообщение об ошибке разработчику, сказав, что оно не работает для указанного слова. Дев это исправил. Оба поделились смехом.
 Corstian Boerman01 апр. 2015 г., 13:58
@MrKWatkins звучит больше как 'supercalifragilisticexpialidocious'
 MrKWatkins19 янв. 2012 г., 18:41
Открытие кода с помощью ILSpy показывает класс с именем EnglishPluralizationService, в котором определено множество исключительных случаев, что делает его интересным для чтения. Мне особенно нравится «пневмоноултрамикроскопический кремниевый вулканокониоз», который я постоянно использую в своих моделях сущностей ... 8о)
 Pierre-Alain Vigeant30 мар. 2011 г., 21:39
Хм, вы разрешаете распространять или просто использовать Design DLL? Я спрашиваю об этом, потому что знаю, что лицензия на DevExpress запрещает перераспределение любой DLL-библиотеки .design.

чтобы была возможность создать правильную строку для «Было что-то (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"));
 Jeremy S20 окт. 2010 г., 18:29
Согласовано. Я также думаю, что предоставленная информация была полезной, поэтому ни одно отрицательное мнение не пришло от меня. Я вообще не провоцирую негативные эмоции в духе "мусорной корзины одного человека ...".
 Jeremy S27 янв. 2010 г., 18:09
Я мог бы интерпретировать вопрос по-другому. Я думаю, что алгоритм должен определять форму множественного числа без намека со стороны разработчика, в то время как ваш метод возлагает ответственность за знание формы множественного числа на разработчика.
 Lawrence Dol27 янв. 2010 г., 03:22
@ Джереми: почему бы и нет? Println («Вы прошли» + singularPlural (count, «quiz», «quizzes») + «пока»)
 Lawrence Dol17 сент. 2010 г., 06:34
@ Джереми: Следовательно, «я обманул ...» ведет - кажется, не оправдывает снижение.
 Jeremy S12 янв. 2010 г., 20:23
Это охватывает только небольшие разделы грамматики, но не учитывает такие слова, как викторины, вечеринки, половинки, мыши, индексы и т. Д. Это хороший первый удар, но есть много других правил, которые, вероятно, должны быть обработаны в первую очередь. ,

luralizationService, поэтому здесь приведен класс модульного тестирования (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
    }
}

которая называется 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.

 Jay Querido04 мар. 2011 г., 03:28
Да, эта библиотека делает только отдельные слова и только существительные (хотя Pluralizer использует этот класс внутри). Эта библиотека облегчает написание целых предложений. Посмотрите на мой блог для большего количества примеров. Pluralizer.Instance.Pluralize ("{Она} {собирается} {ее | их соответствующие} {дома}.", 5)
 Shaun Wilson19 янв. 2013 г., 05:50
Нет исходного кода и ссылки на пакет плохо в блоге?
 John Saunders04 мар. 2011 г., 02:58
Любое преимущество передSystem.Data.Entity.Design.PluralizationServices.PluralizationService?
 Jay Querido30 янв. 2013 г., 23:34
Шон Уилсон - Мой компьютер в настоящее время по частям. Я спешу, чтобы восстановить его и будет обновлять в течение дня или двух. В это время,nuget.org/packages?q=pluralizer

без особых случаев!

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

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

 Greg Hewgill27 июл. 2012 г., 04:36
@Matt: конечно, это подходит для именительного падежа; Я верю, что распространение этого метода на обвинительный случай является простым для проницательного читателя.
 Timwi17 сент. 2010 г., 05:25
Вы должны заставить его бросить, если вы передадите глагол или наречие!
 ℳ  .27 июл. 2012 г., 03:37
Это не сработает для обвинительного дела ...

PluralizationService изSystem.Data.Entity (.NET Framework 4.0)

http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html

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 это влияет наЗамок ActiveRecordInflector класс!

огВот, или жена GitHub здесь

output = Formatting.Pluralization(100, "sausage"); 
 hofnarwillie29 сент. 2014 г., 14:34
Спасибо, что поделился. Рад, что мне не нужно ссылаться на другую сборку.
 amd05 мая 2017 г., 10:59
Просто и красиво !, но скучает пообразовывать форму единственного числа функциональность

Ваш ответ на вопрос