Jawaban:
Anda juga memiliki System.Data.Entity.Design.PluralizationServices.PluralizationService .
PEMBARUAN : Jawaban lama perlu diperbarui. Sekarang ada juga Humanizer: https://github.com/MehdiK/Humanizer
Saya bisa melakukannya untuk orang Esperanto, tanpa kasus khusus!
string plural(string noun) { return noun + "j"; }
Untuk bahasa Inggris, akan berguna jika Anda terbiasa dengan aturan untuk Kata Benda Jamak Beraturan , serta Bentuk Jamak Tidak Beraturan dari Kata Benda . Ada seluruh artikel Wikipedia dalam bahasa Inggris jamak , yang mungkin memiliki beberapa informasi berguna juga.
Kebanyakan ORM mencoba melakukannya, meskipun umumnya tidak sempurna. Saya tahu Castle memiliki Kelas Inflektor yang mungkin bisa Anda lihat-lihat. Melakukannya "dengan sempurna" bukanlah tugas yang mudah ("rules" dalam bahasa Inggris sebenarnya bukan aturan :)), jadi itu tergantung apakah Anda senang dengan pendekatan "tebakan masuk akal".
Saya menyontek di Java - saya ingin dapat menghasilkan string yang benar untuk "Ada n sesuatu", jadi saya menulis foll. sedikit metode utilitas yang kelebihan beban:
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));
}
dipanggil seperti itu
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
Saya telah membuat perpustakaan kecil untuk ini di .net (C #), yang disebut Pluralizer (tidak mengejutkan).
Ini dimaksudkan untuk bekerja dengan kalimat penuh, seperti halnya String.Format.
Ini pada dasarnya bekerja seperti ini:
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);
Itu juga bisa melakukan lebih dari itu. Baca lebih lanjut tentang itu di blog saya . Ini juga tersedia di NuGet.
Saya menggabungkannya berdasarkan Rails pluralizer. Anda dapat melihat posting blog saya di sini , atau di github di sini
output = Formatting.Pluralization(100, "sausage");
Karena pertanyaannya adalah untuk C #, berikut adalah variasi yang bagus pada solusi Software Monkey (lagi-lagi sedikit "curang", tetapi bagi saya cara yang paling praktis dan dapat digunakan kembali untuk melakukan ini):
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;
}
Penggunaannya sebagai berikut:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Subsonik 3 memiliki Inflector
kelas yang membuat saya terkesan dengan memutar Person
ke People
. Saya mengintip sumbernya dan menemukan itu secara alami curang sedikit dengan daftar hardcode tetapi itu benar-benar satu-satunya cara melakukannya dalam bahasa Inggris dan bagaimana manusia melakukannya - kami mengingat bentuk tunggal dan jamak dari setiap kata dan tidak hanya menerapkan aturan . Karena tidak ada maskulin / feminin (/ netral) untuk ditambahkan ke dalam campuran, itu jauh lebih sederhana.
Berikut cuplikannya:
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");
Ini menjelaskan beberapa kata yang tidak memiliki padanan jamak, seperti contoh perlengkapan. Seperti yang mungkin bisa Anda katakan, itu adalah Regex
penggantian sederhana menggunakan $ 1.
Pembaruan:
Tampaknya Subsonik sebenarnya Inflector
adalah kelas Castle ActiveRecordInflector
!
Tidak banyak dokumentasi dari MSDN tentang penggunaan khusus kelas PluralizationService jadi di sini ada kelas uji unit (NUnit) untuk menunjukkan penggunaan dasar. Perhatikan kasus uji ganjil di bagian bawah yang menunjukkan bahwa layanan tersebut tidak sempurna dalam hal bentuk jamak non-standar.
[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
}
}
Halaman ini menunjukkan bagaimana menggunakan PluralizationService
dari System.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
Menggunakan database contoh Northwind Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize tidak Singularize "Order_Details" Ini mengembalikan "Order_Details" dengan s
di akhir. Apa pekerjaannya?