2012-04-11 712 views

Respuesta

26

El más corto probablemente sería la siguiente:

A1.Intersect(A2).Count() 
+3

Esto es 3 caracteres más corto. A1.Count (A2.Contains) :) (Todavía preferiría su solución) – BlueVoodoo

+0

@BlueVoodoo hace el enfoque 'Count Contains' hacer lo correcto en presencia de duplicados? (ver el comentario aclaratorio de Asker) – AakashM

+0

@BlueVoodoo, por el interés, a1.Count (a2.Contains); gana con 00: 00: 05.7862636! – ericosg

2

El siguiente funciona bien y puede producir un mayor rendimiento cuando se utilizan listas:

List<string> a1 = new List<string>() { "aa", "bb", "cc", "dd", "ee" }; 
List<string> a2 = new List<string>() { "cc", "dd", "ee", "bla", "blu" }; 

a1.Count(match => a2.Contains(match)); 

o (gracias @BlueVoodoo) una solución más corto que lleva a cabo solamente ligeramente más rápido:

a1.Count(a2.Contains); 

Pero estas soluciones contar duplicados también, por tanto, en e podría usar:

HashSet<string> a1 = new HashSet<string>() { "aa", "bb", "cc", "dd", "ee" }; 
HashSet<string> a2 = new HashSet<string>() { "cc", "dd", "ee", "bla", "blu" }; 

Que evita los duplicados ya que un HashSet conserva solo una secuencia única.

Después de la evaluación comparativa de lo anterior, HashSet con a1.Count (a2.Contains); proporciona la solución más rápida, incluso con la sobrecarga de la construcción de HashSet.

+0

No es necesario ponerlos en listas, ya que puede hacer que A1.Count (A2.Contains) directamente en las matrices (aún así me gustaría ir a Pavel's intersect). – BlueVoodoo

+0

Por el amor de interés, esta solución corre más rápido que Intersect() el amor de – ericosg

+0

Además interés algunos puntos de referencia: a 10.000.000 iteraciones, Intersección vs LINQ y Lambda: con listas: 00: 00: 09,9623558 vs 00: 00: 06,2140126 con matrices: 00: 00: 09.5918331 vs 00: 00: 48.9175518 naturalmente, linq sigue creando objetos IEnumerable de las matrices, produciendo sobrecarga, pero una vez que todas las listas son realmente más rápidas. – ericosg

2
int[] id1 = { 44, 26, 92, 30, 71, 38 }; 
int[] id2 = { 39, 59, 83, 47, 26, 4, 30 }; 

id1.Intersect(id2).Count(); 
1

siguiente código debe hacer el truco

 var A1 = new[] { "aa", "bb", "cc", "dd", "ee"}; 
     var A2 = new[] { "cc", "dd", "ee", "bla", "blu" }; 

     var query = from one in A1 
        join two in A2 on one equals two 
        select one; 
     var result = query.ToArray();//this should have { "cc", "dd", "ee" } 
Cuestiones relacionadas