2012-08-27 14 views
5

abbiamo il seguente setup: Abbiamo una matrice di oggetti con una stringa (xml-ish ma non normalizzata) e abbiamo una lista/array di stringhe con id .C# Linq, cercando gli stessi elementi in due elenchi

Abbiamo bisogno di scoprire se una stringa da quella lista con ID è anche pressante in uno degli oggetti.

Qui abbiamo una messa a punto che abbiamo provato:

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

Edit:

Ciò che ci aspettiamo è quando facciamo un .Any() su intersect che dice true perché wrapper ha un oggetto con un oggetto di scena quello contiene <id>2</id>, intersect è null.

Se si utilizza il metodo sbagliato, si prega di dire. Dovrebbe funzionare il più velocemente possibile. Un semplice true quando trovato lo farà!

+1

Qual è la tua domanda per favore? –

+0

@DanielHilgarth Ho aggiornato il post – Frederiek

+0

La cosa migliore da fare qui è analizzare il testo in 'MyProperty' in una struttura più leggibile/linq-friendly/manutenibile. – devundef

risposta

6

Per il vostro caso, si potrebbe scrivere il vostro IEqualitycomparer come questo:

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; 
    } 
} 

e troverà

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

Questo funziona perché GetHashCode ritornano sempre 0, e il controllo x.Contains(y) || y.Contains(x).


Un'altra soluzione non-così-hacky è quello di utilizzare un Where in combinazione con Any

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

o sostituire la Where con un altro Any se non si cura di elementi reali e solamente vuoi un true o false.

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

Grazie mille, funziona! – Frederiek

1
wrappers.Where(w=>ids.Any(i=>w.MyProperty.Contains(i))) 
Problemi correlati