¿Cómo puedo comparar dos cadenas en C# y obtener la diferencia?Comparar dos cadenas y obtener la diferencia
por ejemplo:
Cadena1: i tener un coche
string2: tengo un coche nuevo BMW
resultado: nueva, BMW
¿Cómo puedo comparar dos cadenas en C# y obtener la diferencia?Comparar dos cadenas y obtener la diferencia
por ejemplo:
Cadena1: i tener un coche
string2: tengo un coche nuevo BMW
resultado: nueva, BMW
Usted necesita asegurarse de que el conjunto más grande está en el lado izquierdo de la Except
(no estoy seguro si hay una forma pura de LINQ para lograr eso):
static void Main(string[] args)
{
string s1 = "i have a car a car";
string s2 = "i have a new car bmw";
List<string> diff;
IEnumerable<string> set1 = s1.Split(' ').Distinct();
IEnumerable<string> set2 = s2.Split(' ').Distinct();
if (set2.Count() > set1.Count())
{
diff = set2.Except(set1).ToList();
}
else
{
diff = set1.Except(set2).ToList();
}
}
esto no funciona, digamos que distinto debe tener argumentos. Y excepto dice: Error 'System.Collections.Generic.IEnumerable
funciona para mí en .NET 3.5 ¿Está utilizando .NET 2.0? –
tal vez algunas referencias. ¿Qué referencia tienes? – Luis
Se puede utilizar un algoritmo de diferencia para este tarea. El documento "An O(ND) Difference Algorithm and Its Variations" describe un algoritmo bastante poderoso para realizar esta tarea. Para una implementación en C#, puede echarle un vistazo a "An O(ND) Difference Algorithm for C#", pero en mi humilde opinión, seguramente es más interesante echar un vistazo al papel y ponerlo en práctica en caso de que esté interesado en cómo funciona el algoritmo en detalle.
Basado en su pregunta (Es un poco vago.) esto debería funcionar.
var first = string1.Split(' ');
var second = string2.Split(' ');
var primary = first.Length > second.Length ? first : second;
var secondary = primary == second ? first : second;
var difference = primary.Except(secondary).ToArray();
En la parte superior de su archivo, asegúrese de incluir:
using System.Linq;
esto haría que estas dos cadenas sean idénticas: "tengo un automóvil" y "un auto que tengo". Pero sí, no estoy seguro de si eso está bien con el OP. –
esto funciona con repeticiones? por ejemplo "tengo un coche que tengo" vs. "tengo un auto" – Luis
no devuelve resultados si el conjunto más pequeño en el lado izquierdo –
Está hecho para HTML, pero esto ha funcionado muy bien para mí:
http://www.rohland.co.za/index.php/2009/10/31/csharp-html-diff-algorithm/
Usted puede ser capaz de modificarlo para sus propios fines.
podemos asumir querrá dividir por límite de palabra? – ChaosPandion
¿Qué pasa con los espacios entre "nuevo" y "automóvil" y entre "automóvil" y "bmw"? ¿Necesita saber que una de las palabras ocurrió antes de "coche" y la otra después? ¿Y las diferencias entre "tengo un auto nuevo" y "tengo un auto nuevo"? ¿es "nueva" la diferencia aquí también? ¿Qué hay de las eliminaciones? "tengo un auto nuevo" vs. "tengo un auto"? ¿Desea saber que se eliminó "nuevo" + un espacio? En resumen, debe decirnos algunas de sus suposiciones o límites a su problema. –
@Lasse V. Karlsenno, en ese caso la diferencia es "eso", "es" @ ChaosPandion, creo que sí: p. No sé cómo puedo hacer esto: S – Luis