Antworten:
Sie haben auch den System.Data.Entity.Design.PluralizationServices.PluralizationService .
UPDATE : Alte Antwort verdient Aktualisierung. Es gibt jetzt auch Humanizer: https://github.com/MehdiK/Humanizer
Ich kann es für Esperanto tun, ohne Sonderfälle!
string plural(string noun) { return noun + "j"; }
Für Englisch wäre es nützlich, sich mit den Regeln für reguläre Pluralformen von Substantiven sowie für unregelmäßige Pluralformen von Substantiven vertraut zu machen . Es gibt einen ganzen Wikipedia-Artikel über den englischen Plural , der möglicherweise auch einige hilfreiche Informationen enthält.
Die meisten ORMs haben einen Stich drauf, obwohl sie im Allgemeinen nicht perfekt sind. Ich weiß, dass Castle eine Inflector-Klasse hat, in der Sie wahrscheinlich herumstöbern können. Es "perfekt" zu machen ist jedoch keine leichte Aufgabe (englische "Regeln" sind keine wirklichen Regeln :)), daher hängt es davon ab, ob Sie mit einem "vernünftigen Schätz" -Ansatz zufrieden sind.
Ich habe in Java betrogen - ich wollte in der Lage sein, eine korrekte Zeichenfolge für "Es gab n etwas (e)" zu erstellen, also schrieb ich Folgendes. wenig überladene Dienstprogrammmethode:
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));
}
so aufgerufen
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
Ich habe dafür in .net (C #) eine winzige Bibliothek namens Pluralizer erstellt (nicht überraschend).
Es soll mit ganzen Sätzen arbeiten, so etwas wie String.Format.
Es funktioniert im Grunde so:
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);
Es kann auch viel mehr als das. Lesen Sie mehr darüber in meinem Blog . Es ist auch in NuGet verfügbar.
Ich habe einen zusammen mit dem Rails-Pluralizer zusammengeschlagen. Sie können meinen Blog-Beitrag hier oder auf Github hier sehen
output = Formatting.Pluralization(100, "sausage");
Da die Frage für C # war, ist hier eine nette Variation der Software Monkey-Lösung (wieder ein bisschen "Cheat", aber für mich wirklich die praktischste und wiederverwendbarste Art, dies zu tun):
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;
}
Die Verwendung ist wie folgt:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Subsonic 3 hat eine Inflector
Klasse, die mich beeindruckt hat, indem sie sich Person
in verwandelt hat People
. Ich habe einen Blick auf die Quelle geworfen und festgestellt, dass sie mit einer fest codierten Liste natürlich ein wenig schummelt, aber das ist wirklich die einzige Möglichkeit, dies auf Englisch zu tun und wie Menschen es tun - wir erinnern uns an den Singular und den Plural jedes Wortes und wenden nicht nur eine Regel an . Da es nicht männlich / weiblich (/ neutral) gibt, um die Mischung zu ergänzen, ist es viel einfacher.
Hier ist ein Ausschnitt:
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");
Es erklärt einige Wörter, die keine Pluraläquivalente haben, wie das Ausrüstungsbeispiel. Wie Sie wahrscheinlich sehen können, wird es einfach Regex
durch $ 1 ersetzt.
Update:
Es scheint, dass Subsonic Inflector
die CastleInflector
ActiveRecord- Klasse infiziert !
MSDN enthält nicht viel Dokumentation zur spezifischen Verwendung der PluralizationService-Klasse. Hier ist eine Unit-Test-Klasse (NUnit), um die grundlegende Verwendung zu veranschaulichen. Beachten Sie den seltsamen Testfall unten, der zeigt, dass der Service nicht perfekt ist, wenn es um nicht standardmäßige Pluralformen geht.
[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
}
}
Diese Seite zeigt die Verwendung PluralizationService
von System.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
Verwenden der Northwind-Beispieldatenbank von Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize singularisiert nicht "Order_Details" Es gibt "Order_Details" mit dem s
am Ende zurück. Was ist die Arbeit um?