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)?
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
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.
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.
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"));
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.
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");
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"
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!
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
}
}
cette page montre comment utiliser PluralizationService
de System.Data.Entity
(.net Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
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?