Réponses:
Vous disposez également de System.Data.Entity.Design.PluralizationServices.PluralizationService .
MISE À JOUR : l'ancienne réponse mérite d'être 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 des pluriels réguliers de noms , ainsi que des pluriels irréguliers de noms . Il existe un article Wikipédia complet sur le pluriel anglais , qui peut également contenir des informations utiles.
La plupart des ORM ont un coup de main, bien qu'ils ne soient généralement pas parfaits. Je sais que Castle a sa classe Inflector que vous pouvez probablement fouiller. Le faire "parfaitement" n'est cependant pas une tâche facile (les "règles" anglaises ne sont pas vraiment des règles :)), donc cela dépend si vous êtes satisfait d'une approche "raisonnable".
J'ai triché en Java - je voulais être capable de produire une chaîne correcte pour "Il y avait n quelque chose (s)", alors j'ai écrit le foll. méthode utilitaire peu surchargée:
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 ça
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 en .net (C #), appelée Pluralizer (sans surprise).
Il est destiné à fonctionner avec des phrases complètes, quelque chose comme String.Format le fait.
Cela 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 également faire bien plus que cela. En savoir plus sur mon blog . Il est également disponible dans NuGet.
J'en ai fouetté un ensemble basé sur le pluraliseur Rails. Vous pouvez voir mon article de blog ici , ou sur github ici
output = Formatting.Pluralization(100, "sausage");
Comme la question était pour C #, voici une belle variante de la solution de Software Monkey (encore une fois un peu "triche", mais pour moi vraiment la façon la plus pratique et réutilisable de faire cela):
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'utilisation est la suivante:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Subsonic 3 a une Inflector
classe qui m'a impressionné en tournant Person
dans People
. J'ai jeté un coup d'œil à la source et j'ai trouvé que cela trompait naturellement un peu avec une liste codée en dur, 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 n'appliquons pas seulement 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", "$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");
Il rend compte de certains mots n'ayant pas d'équivalents pluriels, comme l'exemple d'équipement. Comme vous pouvez probablement le constater, il effectue un Regex
remplacement simple en utilisant $ 1.
Mise à jour:
Il semble que Subsonic Inflector
est en fait la classe Castle ActiveRecordInflector
!
Pas beaucoup de documentation de MSDN sur l'utilisation spécifique de la classe PluralizationService donc voici une classe de test unitaire (NUnit) pour montrer l'utilisation de base. Remarquez le cas de test étrange en bas qui montre que le service n'est pas parfait lorsqu'il s'agit de formes plurielles non standard.
[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
À l'aide de l'exemple de base de données Northwind de Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize ne singularise pas "Order_Details" Il renvoie "Order_Details" avec le s
à la fin. Quel est le travail autour?