Odpowiedzi:
Masz również System.Data.Entity.Design.PluralizationServices.PluralizationService .
AKTUALIZACJA : Stara odpowiedź zasługuje na aktualizację. Jest teraz także Humanizer: https://github.com/MehdiK/Humanizer
Mogę to zrobić dla esperanta, bez specjalnych przypadków!
string plural(string noun) { return noun + "j"; }
W przypadku języka angielskiego przydatne byłoby zapoznanie się z regułami dotyczącymi zwykłej liczby mnogiej rzeczowników oraz nieregularnej liczby mnogiej rzeczowników . Istnieje cały artykuł w Wikipedii dotyczący angielskiej liczby mnogiej , który może również zawierać przydatne informacje.
Większość ORMów ma w tym coś wspólnego, chociaż generalnie nie są doskonałe. Wiem, że Castle ma swoją klasę Inflector, którą prawdopodobnie możesz poszperać . Jednak zrobienie tego „perfekcyjnie” nie jest łatwym zadaniem (angielskie „zasady” nie są tak naprawdę regułami :)), więc zależy to od tego, czy jesteś zadowolony z podejścia opartego na „rozsądnym przypuszczeniu”.
Oszukiwałem w Javie - chciałem być w stanie stworzyć poprawny ciąg znaków dla "Nie było czegoś", więc napisałem foll. mało przeciążona metoda narzędziowa:
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));
}
wywołane w ten sposób
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
Stworzyłem do tego małą bibliotekę w .net (C #), nazwaną Pluralizer (nic dziwnego).
Jest przeznaczony do pracy z pełnymi zdaniami, podobnie jak w przypadku String.Format.
Zasadniczo działa to tak:
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);
Może też zrobić o wiele więcej. Przeczytaj więcej na ten temat na moim blogu . Jest również dostępny w NuGet.
Zrobiłem jeden razem w oparciu o pluralizator Rails. Możesz zobaczyć mój post na blogu tutaj lub na github tutaj
output = Formatting.Pluralization(100, "sausage");
Ponieważ pytanie dotyczyło C #, oto fajna odmiana rozwiązania Software Monkey (znowu trochę "oszustwa", ale dla mnie naprawdę najbardziej praktyczny i wielokrotnego użytku):
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;
}
Sposób użycia jest następujący:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Subsonic 3 ma Inflector
klasę, która zrobiła na mnie wrażenie, zmieniając się Person
w People
. Zerknąłem na źródło i odkryłem, że naturalnie trochę oszukuje z zakodowaną listą, ale to naprawdę jedyny sposób, aby to zrobić po angielsku i jak to robią ludzie - pamiętamy liczbę pojedynczą i mnogą każdego słowa i nie stosujemy tylko reguły . Ponieważ nie ma męskiego / kobiecego (/ neutralnego), aby dodać do mieszanki, jest to o wiele prostsze.
Oto fragment:
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");
Wynika z tego, że niektóre słowa nie mają odpowiedników w liczbie mnogiej, jak przykład wyposażenia. Jak zapewne możesz powiedzieć, robi to prosteRegex
zamianę za pomocą 1 $.
Aktualizacja:
Wygląda na Inflector
to, że Subsonic ma wpływ na klasę Castle ActiveRecordInflector
!
Niewiele dokumentacji z MSDN na temat konkretnego użycia klasy PluralizationService, więc oto klasa testów jednostkowych (NUnit), aby pokazać podstawowe użycie. Zwróć uwagę na dziwny przypadek testowy na dole, który pokazuje, że usługa nie jest idealna, jeśli chodzi o niestandardowe formy liczby mnogiej.
[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
}
}
Strona ta pokazuje, jak korzystać PluralizationService
zSystem.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
Korzystanie z przykładowej bazy danych Northwind firmy Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize nie Singularize „Order_Details” Zwraca „Order_Details” z s
końcówką. Jaka jest ta praca?