Yanıtlar:
Ayrıca System.Data.Entity.Design.PluralizationServices.PluralizationService'e de sahipsiniz .
GÜNCELLEME : Eski cevap güncellemeyi hak ediyor. Artık Humanizer da var: https://github.com/MehdiK/Humanizer
Bunu Esperanto için özel durumlar olmadan yapabilirim!
string plural(string noun) { return noun + "j"; }
İngilizce için, kuralları aşina olmak için yararlı olacağını Düzenli İsimlerin çoğul halleri yanı sıra İsimlerin düzensiz çoğul . İngilizce çoğul hakkında bazı yararlı bilgiler de içeren tam bir Wikipedia makalesi var.
Genelde mükemmel olmasalar da, çoğu ORM'nin bıçağı vardır. Castle'ın Inflector Sınıfı olduğunu biliyorum, muhtemelen etrafı karıştırabilirsin. Bunu "mükemmel" yapmak kolay bir iş değildir (İngilizce "kurallar" aslında kural değildir :)), bu nedenle "makul tahmin" yaklaşımından memnun olup olmadığınıza bağlıdır.
Java'da hile yaptım - "N tane bir şey vardı" için doğru bir dizgi üretebilmek istedim, bu yüzden dosyayı yazdım. biraz aşırı yüklenmiş yardımcı program yöntemi:
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));
}
böyle çağrıldı
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
Bunun için .net'te (C #) Pluralizer adında küçük bir kitaplık oluşturdum (şaşırtıcı olmayan bir şekilde).
String.Format'ın yaptığı gibi tam cümlelerle çalışması amaçlanmıştır.
Temelde şu şekilde çalışır:
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);
Ayrıca bundan daha fazlasını da yapabilir. Blogumda bununla ilgili daha fazla bilgi edinin . NuGet'te de mevcuttur.
Rails çoğullaştırıcısına göre bir tanesini birlikte çırptım. Blog gönderimi burada veya github'da burada görebilirsiniz
output = Formatting.Pluralization(100, "sausage");
Soru C # için olduğu gibi, burada Software Monkey'nin çözümünün güzel bir varyasyonu var (yine biraz "hile", ama benim için bunu yapmanın gerçekten en pratik ve yeniden kullanılabilir yolu):
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;
}
Kullanım aşağıdaki gibidir:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Sesaltı 3 bir sahiptir Inflectorçevirerek beni etkiledi sınıfını Personiçine People. Kaynağa baktım ve doğal olarak kodlanmış bir liste ile biraz hile yaptığını buldum ama bu gerçekten bunu İngilizce yapmanın tek yolu ve insanlar bunu nasıl yapıyor - her kelimenin tekil ve çoğulunu hatırlıyoruz ve sadece bir kural uygulamıyoruz . Karışıma eklenecek erkeksi / dişil (/ nötr) olmadığı için çok daha basit.
İşte bir pasaj:
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");
Ekipman örneği gibi, çoğul eşdeğerleri olmayan bazı kelimeleri açıklar. Muhtemelen söyleyebileceğiniz gibi, Regex$ 1 kullanarak basit bir değişiklik yapar .
Güncelleme:
Görünüşe göre Subsonic Inflector, Castle ActiveRecordInflector sınıfına ait!
PluralizationService sınıfının özel kullanımıyla ilgili MSDN'den çok fazla belge yok, bu nedenle burada temel kullanımı göstermek için bir birim test sınıfı (NUnit) var. Standart olmayan çoğul biçimler söz konusu olduğunda hizmetin mükemmel olmadığını gösteren alttaki tuhaf test durumuna dikkat edin.
[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
}
}
Nasıl kullanılacağını Bu sayfa gösterileri PluralizationServicearasında System.Data.Entity(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
Microsoft'un Northwind örnek veritabanını kullanarak:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize, "Order_Details" i Tekilleştirmez Sonunda "Order_Details" i döndürür s. İşin etrafında ne var?