2013-05-08 6 views
5

Qual è il modo più veloce e migliore per confrontare 2 elenchi e restituire una corrispondenza. È possibile una sola partita. Elenco1 contiene dati dinamici da un database.Confronta l'elenco e le corrispondenze di ritorno in C#

Il modo in cui lo faccio ora:

foreach (var item1 in List1) 
{ 
    foreach (var item2 in List2) 
    { 
     if(item2 == item1) 
     string match = item1; 
    } 
} 

ho una sensazione come può essere fatto molto più veloce.

risposta

11

Utilizzare Enumerable.Intersect.

var matchItem = List1.Intersect(List2).First(); 

Non proprio sicuro di quanto è più veloce per il codice corrente, si può misurare con cronometro. Ma nel tuo codice attuale dovresti rompere il tuo ciclo interiore e quello esterno per trovare la corrispondenza. Qualcosa di simile:

foreach (var item1 in List1) 
{ 
    string match = null; 
    foreach (var item2 in List2) 
    { 
     if (item2 == item1) 
     { 
      match = item1; 
      break; 
     } 
    } 
    if (match != null) 
     break; 
} 
+1

controllerò se funziona – Bernardmoes

+0

@Habib, è più veloce o sintetica? Intendo dire internamente lo stesso sminuzzamento? – tariq

+0

@ tariq, sì, fa il loop internamente, non sono sicuro che sia più veloce, è per questo che ho fornito l'altra opzione con il codice modificato dalla domanda. – Habib

2

Hai molti modi per farlo. Dipende principalmente dai dati che stai cercando di abbinare.

  • La prima cosa che si può fare è avere un elenco ordinato
  • quindi se si conosce il valore medio della lista si può scorrere l'elenco dall'inizio della dalla fine
  • , ma per lo più solo riportare il valore poiché lo hai trovato

anche i primi 2 punti funzioneranno solo se la tua lista ha qualche valore numerico su cui puoi fare affidamento per identificare un oggetto.

La prima ottimizzazione che puoi fare è:

Foreach (var item1 in List1) 
{ 
    Foreach (var item2 in List2) 
    { 
     if(item2 == item1) return item1; 
    } 
} 

Se avete veramente bisogno questa routine per essere molto veloce dovrete fare ottimizzazioni in base ai dati che è nelle vostre liste.

anche se i dati sono string in entrambe le liste, è possibile generare un codice hash per ogni stringa (string.GetHashCode) e poi si basano sul hascode per ordinare e ricercare negli elenchi.

Ci sono molti altri modi, ma tutto dipende da:

  • la quantità di dati che avete nelle vostre liste (se hai solo 100 elementi non sarà possibile vedere un sacco di miglioramenti delle prestazioni)
  • se le vostre liste sono statici o dinamici
  • quanto spesso può cambiare se sono dinamici
  • quanto spesso si fa a fare una ricerca in questi elenchi
  • ...
1

È possibile cortocircuitare i loop quando si trova una corrispondenza. È quindi possibile utilizzare un metodo che restituisce l'elemento che corrisponde, oppure null se non abbinato (assumendo gli elementi sono tipi referenze):

foreach (var item1 in List1) 
    foreach (var item2 in List2) 
     if (item2 == item1) 
      return item1; 

return null;