2010-07-27 27 views
22

¿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

+1

podemos asumir querrá dividir por límite de palabra? – ChaosPandion

+2

¿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. –

+0

@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

Respuesta

23

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(); 
     } 
    } 
+0

esto no funciona, digamos que distinto debe tener argumentos. Y excepto dice: Error 'System.Collections.Generic.IEnumerable ' no contiene una definición para 'Except' y ningún método de extensión 'Except' que acepta un primer argumento de tipo 'System.Collections.Generic.IEnumerable 'se puede encontrar (¿falta una directiva using o una referencia de ensamblado?) – Luis

+0

funciona para mí en .NET 3.5 ¿Está utilizando .NET 2.0? –

+0

tal vez algunas referencias. ¿Qué referencia tienes? – Luis

5

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.

8

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; 
+0

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. –

+0

esto funciona con repeticiones? por ejemplo "tengo un coche que tengo" vs. "tengo un auto" – Luis

+0

no devuelve resultados si el conjunto más pequeño en el lado izquierdo –

Cuestiones relacionadas