Câu trả lời:
Bạn cũng có System.Data.Entity.Design.PluificationServices.PluificationService .
CẬP NHẬT : Câu trả lời cũ đáng được cập nhật. Hiện có cả Nhân văn: https://github.com/MehdiK/Humanizer
Tôi có thể làm điều đó cho Esperanto, không có trường hợp đặc biệt!
string plural(string noun) { return noun + "j"; }
Đối với tiếng Anh, sẽ rất hữu ích nếu làm quen với các quy tắc đối với Danh từ Số nhiều Thông thường , cũng như Số lượng Nhiều Danh từ Bất thường . Có cả một bài viết trên Wikipedia về số nhiều tiếng Anh , có thể có một số thông tin hữu ích.
Hầu hết các ORM đều gặp khó khăn, mặc dù chúng thường không hoàn hảo. Tôi biết Castle có Lớp Inflector mà bạn có thể có thể tham gia. Tuy nhiên, thực hiện nó một cách "hoàn hảo" không phải là một nhiệm vụ dễ dàng ("quy tắc" trong tiếng Anh không thực sự là quy tắc :)), vì vậy nó phụ thuộc vào việc bạn có hài lòng với cách tiếp cận "đoán hợp lý" hay không.
Tôi đã gian lận trong Java - tôi muốn có thể tạo ra một chuỗi chính xác cho "Có n cái gì đó", vì vậy tôi đã viết foll. phương thức tiện ích quá tải ít:
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));
}
kêu gọi như vậy
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
Tôi đã tạo một thư viện nhỏ cho điều này trong .net (C #), được gọi là Pluralizer (không ngạc nhiên).
Nó có nghĩa là làm việc với các câu đầy đủ, giống như String.Format.
Về cơ bản nó hoạt động như thế này:
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);
Nó cũng có thể làm nhiều hơn thế. Đọc thêm về nó trên blog của tôi . Nó cũng có sẵn trong NuGet.
Tôi đã đánh một cái với nhau dựa trên trình đa nguyên Rails. Bạn có thể xem bài đăng trên blog của tôi tại đây hoặc trên github tại đây
output = Formatting.Pluralization(100, "sausage");
Như câu hỏi dành cho C #, đây là một biến thể hay về giải pháp của Software Monkey (một lần nữa là một chút "gian lận", nhưng đối với tôi thực sự là cách thực tế nhất và có thể tái sử dụng):
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;
}
Cách sử dụng như sau:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Subsonic 3 có một Inflector
lớp học mà tôi ấn tượng bằng cách rẽ Person
vào People
. Tôi đã xem qua nguồn và thấy nó tự nhiên gian lận một chút với danh sách được mã hóa cứng nhưng đó thực sự là cách duy nhất để làm điều đó trong tiếng Anh và cách con người làm điều đó - chúng tôi nhớ số ít và số nhiều của mỗi từ và không chỉ áp dụng một quy tắc . Vì không có nam tính / nữ tính (/ trung tính) để thêm vào hỗn hợp, nó đơn giản hơn rất nhiều.
Đây là một đoạn mã:
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");
Nó giải thích cho một số từ không có số nhiều tương đương, như ví dụ về thiết bị. Như bạn có thể biết, nó thực hiện một Regex
thay thế đơn giản bằng cách sử dụng $ 1.
Cập nhật:
Có vẻ như Subsonic's không Inflector
giống với lớp Castle ActiveRecordInflector
!
Không có nhiều tài liệu từ MSDN về cách sử dụng cụ thể của lớp PlurationService, vì vậy đây là một lớp kiểm tra đơn vị (NUnit) để hiển thị cách sử dụng cơ bản. Lưu ý trường hợp kiểm tra kỳ lạ ở dưới cùng cho thấy dịch vụ không hoàn hảo khi nói đến các dạng số nhiều không chuẩn.
[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
}
}
Trang này hiển thị cách sử dụng PluralizationService
của System.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
Sử dụng cơ sở dữ liệu ví dụ về Northwind của Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize không Singularize "Order_Details" Nó trả về "Order_Details" với s
phần cuối. Công việc xung quanh là gì?