Y a - t-il un algorithme dans c# pour singulariser-pluraliser un mot?

y a - t-il un algorithme en c# pour singulariser-pluraliser un mot (en anglais) ou Existe-t-il une bibliothèque .net pour le faire (peut-être aussi dans différentes langues)?

95
demandé sur Liam 2009-01-24 10:42:08

11 réponses

vous avez aussi le système .Données.Entité.Conception.Pluralisationservices.PluralizationService .

UPDATE : L'ancienne réponse mérite une mise à jour. Il y a maintenant aussi Humanizer: https://github.com/MehdiK/Humanizer

169
répondu Daniel 2014-11-08 05:09:29

je peux le faire pour L'Espéranto, sans cas particuliers!

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

Pour l'anglais, il serait utile de se familiariser avec les règles de Pluriels Réguliers des Noms , ainsi que les Pluriels Irréguliers des Noms . Il y a un article entier de Wikipedia sur le en anglais au pluriel , qui peut avoir quelques informations utiles aussi.

15
répondu Greg Hewgill 2009-01-24 07:52:46

la plupart des ORMs ont un coup de couteau, bien qu'ils ne sont généralement pas parfaits. Je sais que Castle a Classe Inflecteur vous pouvez probablement fouiner autour. Le faire " parfaitement "n'est pas une tâche facile bien que (anglais" rules "are not really rules :)), donc cela dépend si vous êtes heureux avec une" supposition raisonnable " approche.

14
répondu Steven Robbins 2011-03-04 01:57:14

j'ai triché en Java - je voulais être capable de produire une chaîne correcte pour" il n'y avait rien", donc j'ai écrit la suite. little Overload utility method:

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

invoqué comme tel

System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
12
répondu Lawrence Dol 2014-01-31 02:40:24

j'ai créé une petite bibliothèque pour cela dans .net (C#), appelée Pluralizer (sans surprise).

il est destiné à travailler avec des phrases complètes, quelque chose comme la corde.Format ne.

il fonctionne essentiellement comme ceci:

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

il peut aussi faire beaucoup plus que cela. Lire plus sur le sur mon blog . Il est également disponible en NuGet.

8
répondu Jay Querido 2011-03-04 01:33:36

j'en ai fait un ensemble basé sur le rail pluraliseur. Vous pouvez voir mon billet de blog ici , ou sur github ici

output = Formatting.Pluralization(100, "sausage"); 
8
répondu Matt Grande 2014-10-21 19:24:08

comme la question était pour C#, voici une belle variation sur la solution de logiciel Monke's (encore un peu d'un "cheat", mais pour moi vraiment la façon la plus pratique et réutilisable de le faire):

    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;
    }

l'usage est le suivant:

"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"

"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
4
répondu Zaid Masud 2012-02-08 11:41:35

Subsonic 3 a une classe Inflector qui m'a impressionné en transformant Person en People . J'ai jeté un coup d'oeil à la source et j'ai constaté qu'il trompe naturellement un peu avec une liste codée mais c'est vraiment la seule façon de le faire en anglais et comment les humains le font - nous nous souvenons du singulier et du pluriel de chaque mot et ne pas appliquer une règle. Comme il n'y a pas de masculin/féminin(/neutre) à ajouter au mélange, c'est beaucoup plus simple.

Voici un extrait:

AddSingularRule("^(ox)en", "");
AddSingularRule("(vert|ind)ices$", "ex");
AddSingularRule("(matr)ices$", "ix");
AddSingularRule("(quiz)zes$", "");

AddIrregularRule("person", "people");
AddIrregularRule("man", "men");
AddIrregularRule("child", "children");
AddIrregularRule("sex", "sexes");
AddIrregularRule("tax", "taxes");
AddIrregularRule("move", "moves");

AddUnknownCountRule("equipment");

il explique que certains mots n'ont pas d'équivalents au pluriel, comme l'exemple de l'équipement. Comme vous pouvez probablement le dire, il fait un simple Regex remplacer en utilisant $1.

mise à jour:

Il apparaît Subsonic Inflector est en fait le Château ActiveRecord Inflector classe!

3
répondu Chris S 2009-08-28 09:51:32

pas beaucoup de documentation de MSDN sur l'usage spécifique de la classe PluralizationService donc voici une classe test unitaire (NUnit) pour montrer l'usage de base. Remarquez le cas de test bizarre en bas qui montre que le service n'est pas parfait quand il s'agit de formes non standard au pluriel.

[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
    }
}
2
répondu Ryan Rodemoyer 2014-09-24 00:32:02

cette page montre comment utiliser PluralizationService de System.Data.Entity (.net Framework 4.0)

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

1
répondu riofly 2013-09-24 22:56:35

utilisant la base de données D'exemples Northwind de Microsoft:

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

au singulier n'est pas au singulier "Order_Details" Il retourne " Order_Details "avec le s à la fin. Qu'est-ce que le travail?

1
répondu RandallTo 2015-03-26 06:46:53