usuario - ¿Hay algún algoritmo en c#para singularizar-pluralizar una palabra?
crear un programa que pida una letra al usuario y diga si se trata de una vocal. (11)
¿Hay algún algoritmo en c # para singularizar - pluralizar una palabra (en inglés) o existe una biblioteca .net para hacer esto (también puede estar en diferentes idiomas)?
Batí uno en base al pluralizador Rails. Puedes ver mi blog here , o en github aquí
output = Formatting.Pluralization(100, "sausage");
Como la pregunta era por C #, aquí hay una buena variación de la solución de Software Monkey (una vez más un "truco", pero para mí realmente es la forma más práctica y reutilizable de hacerlo):
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;
}
El uso es el siguiente:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Creé una pequeña biblioteca para esto en .net (C #), llamada Pluralizer (como era de esperar).
Está destinado a trabajar con oraciones completas, algo así como String.Format lo hace.
Básicamente funciona así:
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);
También puede hacer mucho más que eso. Lea más sobre esto en mi blog . También está disponible en NuGet.
Esta página muestra cómo usar PluralizationService
of System.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
Hice trampa en Java - Quería poder producir una cadena correcta para "Había n algo (s)", así que escribí el resultado. pequeño método de utilidad sobrecargado:
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 como tal
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
La mayoría de los ORM tienen una puñalada, aunque generalmente no son perfectos. Sé que Castle tiene su Clase de Inflector que probablemente puedas hurgar . Sin embargo, hacerlo "a la perfección" no es una tarea fácil (las "reglas" en inglés no son realmente reglas :)), por lo que depende si está satisfecho con un enfoque de "conjetura razonable".
No hay mucha documentación de MSDN sobre el uso específico de la clase PluralizationService así que aquí hay una clase de prueba de unidad (NUnit) para mostrar el uso básico. Observe el caso de prueba impar en la parte inferior que muestra que el servicio no es perfecto cuando se trata de formularios plurales no estándar.
[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
}
}
Puedo hacerlo por Esperanto, ¡sin casos especiales!
string plural(string noun) { return noun + "j"; }
Para el inglés, sería útil familiarizarse con las reglas para Plurales Regulares de Sustantivos , así como Plurales Irregulares de Sustantivos . Existe todo un artículo de Wikipedia sobre el plural en inglés , que también puede contener información útil.
Subsonic 3 tiene una clase Inflector
que me impresionó al convertir Person
en People
. Eché un vistazo a la fuente y descubrí que naturalmente hace trampas con una lista codificada, pero esa es realmente la única forma de hacerlo en inglés y cómo los humanos lo hacen: recordamos el singular y el plural de cada palabra y no solo aplicamos una regla . Como no hay masculino / femenino (/ neutro) para agregar a la mezcla, es mucho más simple.
Aquí hay un fragmento:
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");
Representa algunas palabras que no tienen equivalentes en plural, como el ejemplo del equipo. Como probablemente puedas decir, lo hace con un Regex
simple usando $ 1.
Actualizar:
¡Parece que el Inflector
de Subsonic es de hecho la clase Castle ActiveRecord Inflector
!
También tiene el System.Data.Entity.Design.PluralizationServices.PluralizationService .
ACTUALIZACIÓN : la respuesta anterior merece una actualización. Ahora también hay Humanizer: https://github.com/MehdiK/Humanizer
Usando la base de datos de ejemplo de Neptuno de Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize no Singularize "Order_Details" Devuelve "Order_Details" con la s
al final. ¿Cuál es el trabajo?