2012-08-27 45 views
5

tenemos la siguiente configuración: Tenemos una matriz de objetos con una cadena (xml-ish pero no está normalizada) y tenemos una lista/matriz de cadenas con id .C# Linq, buscando los mismos elementos en dos listas

Tenemos que averiguar si una cadena de esa lista con id también está presente en uno de los objetos.

Aquí tenemos una configuración que hemos tratado:

public class Wrapper 
{ 
    public string MyProperty { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Wrapper> wrappers = new List<Wrapper>() 
     { 
      new Wrapper{ MyProperty = "<flkds,dlsklkdlsqkdkqslkdlqk><id>3</id><sqjldkjlfdskjlkfjsdklfj>"}, 
      new Wrapper{ MyProperty = "<flkds,dlsklkdlsqkdkqslkdlqk><id>2</id><sqjldkjlfdskjlkfjsdklfj>"} 
     }; 
     string[] ids = { "<id>0</id>", "<id>1</id>", "<id>2</id>" }; 

     var props = wrappers.Select(w => w.MyProperty); 
     var intersect = props.Intersect(ids, new MyEquilityTester()); 
     Debugger.Break(); 
    } 
} 

class MyEquilityTester: IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Contains(y); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 

Editar:

Lo que esperamos es cuando hacemos un .Any() en intersect que se dice true porque las envolturas tiene un objeto con un puntal que contiene <id>2</id>, intersect es null.

Si estamos utilizando el método incorrecto, por favor diga. Debería funcionar lo más rápido posible. Un simple true cuando se encuentre lo hará!

+1

Cuál es tu pregunta, por favor? –

+0

@DanielHilgarth He actualizado la publicación – Frederiek

+0

Lo mejor que se puede hacer aquí es analizar el texto en 'MyProperty' con una estructura más legible/compatible con linq/mantenimiento. – devundef

Respuesta

6

Por su caso, usted podría escribir su IEqualitycomparer así:

class MyEquilityTester: IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Contains(y) || y.Contains(x); 
    } 

    public int GetHashCode(string obj) 
    { 
     return 0; 
    } 
} 

y se encontrará

<flkds,dlsklkdlsqkdkqslkdlqk><id>2</id><sqjldkjlfdskjlkfjsdklfj> 

Esto funciona porque GetHashCode siempre vuelven 0, y el cheque x.Contains(y) || y.Contains(x).


Otra solución no tan hacky es utilizar un Where en combinación con Any

IEnumerable<String> intersect = props.Where(p => ids.Any (i => p.Contains(i))); 

o reemplazar el Where con otro Any si no se preocupan por los elementos reales y sólo se quiere un true o false.

bool intersect = props.Any(p => ids.Any (i => p.Contains(i))); 
+0

Thx mucho hombre, ¡funciona! – Frederiek

1
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i))) 
Cuestiones relacionadas