답변:
System.Data.Entity.Design.PluralizationServices.PluralizationService 도 있습니다 .
업데이트 : 이전 답변은 업데이트 할 가치가 있습니다. 이제 Humanizer도 있습니다 : https://github.com/MehdiK/Humanizer
특별한 경우없이 에스페란토로 할 수 있습니다!
string plural(string noun) { return noun + "j"; }
영어의 경우 정규 복수 명사 및 불규칙 복수 명사 규칙에 익숙해지는 것이 유용 할 것 입니다. 영어 복수형 에 대한 전체 Wikipedia 기사가 있으며,이 기사 에는 유용한 정보도있을 수 있습니다.
대부분의 ORM은 일반적으로 완벽하지는 않지만 찌르는 경향이 있습니다. 캐슬에는 아마 당신이 찌를 수있는 인플 렉터 클래스 가 있다는 것을 알고 있습니다. "완벽하게"하는 것은 쉬운 일이 아닙니다 (영어 "규칙"은 실제로 규칙이 아닙니다 :)). 따라서 "합리적인 추측"접근 방식에 만족하는지 여부에 따라 다릅니다.
나는 자바에서 속임수를 썼다. "There were n something (s)"에 대한 올바른 문자열을 생성하고 싶었 기 때문에 다음 글을 썼다. 약간의 과부하 유틸리티 방법 :
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 pluralizer를 기반으로 하나를 채찍질했습니다. 여기 에서 내 블로그 게시물을 보거나 여기 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"
음속 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을 사용하여 간단한 교체를 수행합니다.
업데이트 :
그것은 음속의 표시는 Inflector
가리키고있다 성 액티브의Inflector
클래스!
PluralizationService 클래스의 특정 사용법에 대한 MSDN의 문서가 많지 않으므로 여기에 기본 사용법을 보여주는 단위 테스트 클래스 (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
Microsoft의 Northwind 예제 데이터베이스 사용 :
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize는 "Order_Details"를 Singularize하지 않습니다 s
. 끝에 있는 "Order_Details"를 반환합니다 . 해결 방법은 무엇입니까?