Respostas:
Você também tem System.Data.Entity.Design.PluralizationServices.PluralizationService .
ATUALIZAÇÃO : a resposta antiga merece atualização. Agora também existe o Humanizer: https://github.com/MehdiK/Humanizer
Posso fazer pelo Esperanto, sem casos especiais!
string plural(string noun) { return noun + "j"; }
Para o inglês, seria útil se familiarizar com as regras para Plurais regulares de substantivos , bem como Plurais irregulares de substantivos . Há todo um artigo da Wikipedia no plural inglês , que também pode conter algumas informações úteis.
A maioria dos ORMs tenta fazer isso, embora geralmente não sejam perfeitos. Eu sei que Castle tem sua classe inflector, você provavelmente pode dar uma olhada. No entanto, fazê-lo "perfeitamente" não é uma tarefa fácil ("regras" em inglês não são realmente regras :)), então depende se você está satisfeito com uma abordagem de "palpite razoável".
Eu trapaceei em Java - queria ser capaz de produzir uma string correta para "Houve n algo (s)", então escrevi o seguinte. método utilitário pouco sobrecarregado:
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));
}
invocado assim
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
Eu criei uma pequena biblioteca para isso em .net (C #), chamada Pluralizer (sem surpresa).
Ele deve funcionar com frases completas, algo como String.Format.
Basicamente, funciona assim:
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);
Também pode fazer muito mais do que isso. Leia mais sobre isso no meu blog . Também está disponível no NuGet.
Eu bati um junto com base no pluralizador Rails. Você pode ver minha postagem do blog aqui , ou no github aqui
output = Formatting.Pluralization(100, "sausage");
Como a pergunta era para C #, aqui está uma boa variação da solução do Software Monkey (novamente um pouco "cheat", mas para mim realmente a maneira mais prática e reutilizável de fazer isso):
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;
}
O uso é o seguinte:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Subsonic 3 tem uma Inflector
classe que me impressionou ao se Person
tornarPeople
. Eu dei uma olhada na fonte e descobri que naturalmente trapaceia um pouco com uma lista codificada, mas essa é realmente a única maneira de fazer isso em inglês e como os humanos fazem isso - lembramos do singular e do plural de cada palavra e não apenas aplicamos uma regra . Como não há masculino / feminino (/ neutro) para adicionar à mistura, é muito mais simples.
Aqui está um snippet:
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");
É responsável por algumas palavras que não possuem equivalentes no plural, como o exemplo do equipamento. Como você provavelmente pode dizer, ele faz um simplesRegex
substituição usando $ 1.
Atualização:
Parece que Subsonic Inflector
é de fato a classe Castle ActiveRecordInflector
!
Não há muita documentação do MSDN sobre o uso específico da classe PluralizationService, então aqui está uma classe de teste de unidade (NUnit) para mostrar o uso básico. Observe o caso de teste estranho na parte inferior que mostra que o serviço não é perfeito quando se trata de formas plurais não padronizadas.
[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
}
}
Esta página mostra como usar PluralizationService
deSystem.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
Usando o banco de dados de exemplo Northwind da Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize não Singularize "Order_Details" Ele retorna "Order_Details" com s
no final. Qual é a solução?