มีอัลกอริทึมใดใน c # ที่จะทำให้เป็นเอกพจน์ - พหูพจน์ (ในภาษาอังกฤษ) หรือมีไลบรารี. net เพื่อทำสิ่งนี้ (อาจเป็นภาษาอื่นด้วย)
มีอัลกอริทึมใดใน c # ที่จะทำให้เป็นเอกพจน์ - พหูพจน์ (ในภาษาอังกฤษ) หรือมีไลบรารี. net เพื่อทำสิ่งนี้ (อาจเป็นภาษาอื่นด้วย)
คำตอบ:
นอกจากนี้คุณยังมีSystem.Data.Entity.Design.PluralizationServices.PluralizationService
UPDATE : คำตอบเก่าสมควรได้รับการปรับปรุง ตอนนี้ยังมี Humanizer: https://github.com/MehdiK/Humanizer
ฉันสามารถทำเพื่อเอสเปรันโตได้โดยไม่มีกรณีพิเศษ!
string plural(string noun) { return noun + "j"; }
สำหรับภาษาอังกฤษก็จะเป็นประโยชน์ในการทำความคุ้นเคยกับกฎระเบียบสำหรับการพหูพจน์ปกติของคำนามเช่นเดียวกับการที่ผิดปกติพหูพจน์ของคำนาม มีบทความ Wikipedia ทั้งหมดเกี่ยวกับพหูพจน์ภาษาอังกฤษซึ่งอาจมีข้อมูลที่เป็นประโยชน์เช่นกัน
ORM ส่วนใหญ่มีการแทงแม้ว่าโดยทั่วไปจะไม่สมบูรณ์แบบ ฉันรู้ว่า Castle มีInflector Class ที่คุณอาจจะโผล่ไปรอบ ๆ การทำอย่าง "สมบูรณ์แบบ" ไม่ใช่เรื่องง่าย ("กฎ" ภาษาอังกฤษไม่ใช่กฎจริงๆ :)) ดังนั้นจึงขึ้นอยู่กับว่าคุณพอใจกับวิธีการ "เดาที่สมเหตุสมผล" หรือไม่
ฉันโกงใน Java - ฉันต้องการสร้างสตริงที่ถูกต้องสำหรับ "There were n something (s)" ดังนั้นฉันจึงเขียน foll วิธียูทิลิตี้ที่โอเวอร์โหลดเล็กน้อย:
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));
}
เรียกเช่นนั้น
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
ฉันได้สร้างไลบรารีเล็ก ๆ สำหรับสิ่งนี้ใน. net (C #) เรียกว่า Pluralizer (ไม่แปลกใจเลย)
มันหมายถึงการทำงานกับประโยคเต็มบางอย่างเช่น String.Format ทำ
โดยทั่วไปจะใช้งานได้ดังนี้:
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);
นอกจากนี้ยังสามารถทำได้มากกว่านั้น อ่านข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ในบล็อกของฉัน นอกจากนี้ยังมีใน NuGet
ฉันตีหนึ่งเข้าด้วยกันตามพหูพจน์ของ Rails คุณสามารถดูโพสต์บล็อกของฉันได้ที่นี่หรือบน github ที่นี่
output = Formatting.Pluralization(100, "sausage");
ตามที่เป็นคำถามสำหรับ C # นี่คือรูปแบบที่ดีในการแก้ปัญหาของ Software Monkey (อีกครั้งคือ "โกง" แต่สำหรับฉันแล้ววิธีที่ใช้งานได้จริงและนำกลับมาใช้ใหม่ได้มากที่สุด):
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;
}
การใช้งานมีดังนี้:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Subsonic 3 มีInflector
คลาสที่ทำให้ฉันประทับใจเมื่อเปลี่ยนPerson
เป็นPeople
. ฉันมองไปที่แหล่งที่มาและพบว่ามันโกงเล็กน้อยตามธรรมชาติด้วยรายการที่เข้ารหัส แต่นั่นเป็นวิธีเดียวที่จะทำในภาษาอังกฤษและวิธีที่มนุษย์ทำ - เราจำเอกพจน์และพหูพจน์ของแต่ละคำได้และไม่เพียงแค่ใช้กฎ . เนื่องจากไม่มีผู้ชาย / ผู้หญิง (/ เป็นกลาง) ที่จะเพิ่มลงในส่วนผสมจึงง่ายกว่ามาก
นี่คือตัวอย่าง:
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");
มันอธิบายถึงคำบางคำที่ไม่มีความเทียบเท่าพหูพจน์เช่นตัวอย่างอุปกรณ์ อย่างที่คุณสามารถบอกได้ว่ามันRegex
แทนที่ง่ายๆโดยใช้ $ 1
อัปเดต:
ดูเหมือนว่า Subsonic Inflector
จะใส่ชื่อคลาสCastle ActiveRecordInflector
!
เอกสารประกอบจาก MSDN ไม่มากนักเกี่ยวกับการใช้งานเฉพาะของคลาส PluralizationService ดังนั้นนี่คือคลาสทดสอบหน่วย (NUnit) เพื่อแสดงการใช้งานพื้นฐาน สังเกตกรณีทดสอบแปลก ๆ ที่ด้านล่างซึ่งแสดงว่าบริการไม่สมบูรณ์แบบเมื่อเป็นรูปพหูพจน์ที่ไม่ได้มาตรฐาน
[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
}
}
หน้านี้แสดงให้เห็นถึงวิธีการใช้งานPluralizationService
ของSystem.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
การใช้ฐานข้อมูลตัวอย่าง Northwind ของ Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize ไม่เป็น Singularize "Order_Details" แต่จะส่งกลับ "Order_Details" พร้อมกับs
ต่อท้าย งานรอบล่ะ?