Risposte:
Hai anche System.Data.Entity.Design.PluralizationServices.PluralizationService .
AGGIORNAMENTO : la vecchia risposta merita un aggiornamento. Ora c'è anche Humanizer: https://github.com/MehdiK/Humanizer
Posso farlo per l'esperanto, senza casi speciali!
string plural(string noun) { return noun + "j"; }
Per l'inglese, sarebbe utile acquisire familiarità con le regole per i plurali regolari dei nomi , nonché per i plurali irregolari dei nomi . C'è un intero articolo di Wikipedia sul plurale inglese , che potrebbe contenere anche alcune informazioni utili.
La maggior parte degli ORM ci prova, anche se generalmente non sono perfetti. So che Castle ha la sua classe Inflector che probabilmente puoi dare un'occhiata in giro. Farlo "perfettamente" non è un compito facile (le "regole" inglesi non sono realmente regole :)), quindi dipende se sei soddisfatto di un approccio "ragionevole".
Ho imbrogliato in Java: volevo essere in grado di produrre una stringa corretta per "C'erano n qualcosa", quindi ho scritto il foll. metodo di utilità poco sovraccarico:
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));
}
invocato in questo modo
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
Ho creato una piccola libreria per questo in .net (C #), chiamata Pluralizer (non sorprende).
È pensato per funzionare con frasi complete, qualcosa come String.Format.
Fondamentalmente funziona in questo modo:
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);
Può anche fare molto di più. Per saperne di più sul mio blog . È disponibile anche in NuGet.
Ne ho creato uno in base al pluralizzatore di Rails. Puoi vedere il mio post sul blog qui o su GitHub qui
output = Formatting.Pluralization(100, "sausage");
Poiché la domanda era per C #, ecco una bella variazione sulla soluzione di Software Monkey (di nuovo un po 'un "trucco", ma per me davvero il modo più pratico e riutilizzabile per farlo):
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'utilizzo è il seguente:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Subsonic 3 ha una Inflector
classe che mi ha impressionato trasformandomi Person
in People
. Ho sbirciato la fonte e ho scoperto che naturalmente inganna un po 'con un elenco codificato, ma questo è davvero l'unico modo per farlo in inglese e come lo fanno gli umani: ricordiamo il singolare e il plurale di ogni parola e non applichiamo solo una regola . Dato che non c'è maschile / femminile (/ neutro) da aggiungere al mix, è molto più semplice.
Ecco uno snippet:
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");
Rappresenta alcune parole che non hanno equivalenti plurali, come l'esempio dell'attrezzatura. Come probabilmente puoi dire, fa una semplice Regex
sostituzione usando $ 1.
Aggiornamento:
sembra che Subsonic Inflector
sia la classe Castle ActiveRecordInflector
!
Non c'è molta documentazione da MSDN sull'utilizzo specifico della classe PluralizationService, quindi ecco una classe di unit test (NUnit) per mostrare l'utilizzo di base. Notare lo strano caso di test in basso che mostra che il servizio non è perfetto quando si tratta di forme plurali 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
}
}
Questa pagina mostra come utilizzare PluralizationService
di System.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
Utilizzando il database di esempio Northwind di Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize non singularizza "Order_Details" Restituisce "Order_Details" con s
alla fine. Qual è il lavoro intorno?