2011-12-22 35 views
6

Tengo dos conjuntos de datos (Listas de objetos complejos o datos SQL - LINQ to Entities) en los que trato de encontrar la intersección de los dos conjuntos de datos. Específicamente una intersección de la propiedad Complex "HashData" como se ve a continuación:Intersección de dos conjuntos (Listas) de datos

SQL data

es probable que sea alrededor de 10.000 filas El conjunto de la izquierda, mientras que el conjunto de la derecha es siempre un subconjunto de aproximadamente 100 filas Me doy cuenta de que si clasifico el conjunto de la izquierda por "Hashdata" al almacenarlo, hacer una búsqueda sería mucho más rápido usando algún tipo de algoritmo de búsqueda Binario, sin embargo, no puedo hacer esto por razones no pertinentes a la pregunta.

El subconjunto más pequeño de datos nunca se almacena en SQL (solo se muestra en una tabla SQL a continuación con fines explicativos). Se presenta en un List<ShowData> en tiempo de ejecución.

En el momento que estoy haciendo un bucle patética a través de los datos y el juego del modo siguiente (recording es la Lista 100 de fila y ShowData es la Lista 10000 fila):

List<ShowData> ShowData = (from showData in context.ShowDatas 
          where (showData.Show.Id == advert.Id) 
          orderby showData.HashData ascending 
          select showData).ToList(); 

foreach (ShowData recording in recordingPoints) { 
    foreach (ShowData actual in ShowData) { 
     if (recording.HashData == actual.HashData) { 
     } 
    } 
} 

Así que básicamente lo que estoy tratando hacer es:

Devuelve una lista de objetos ShowData (conjunto grande) donde cualquier HashData (del conjunto pequeño) se encuentra en ShowData PERO dentro de la consulta inicial de LINQ to Entity al DB.

yo nos acercamos con:

private IEnumerable<ShowData> xyz(List<ShowData> aObj, List<ShowData> bObj) 
    { 
     IEnumerable<string> bStrs = bObj.Select(b => b.HashData).Distinct(); 
     return aObj.Join(bStrs, a => a.HashData, b => b, (a, b) => a); 
    } 

Respuesta

6

dado que está utilizando IEnumerable, puede utilizar el método de intersección de extensión en lugar de Unir. Si desea devolver el conjunto grande, debería intersectar el resultado de la consulta de conjunto grande con el conjunto más pequeño. Usted tendría que escribir un Comparer IEquality como se muestra aquí: http://msdn.microsoft.com/en-us/library/bb355408.aspx a comparar sus objetos, a continuación, llamar al método Intersect extensión:

return bStrs.Intersect(aObj, new MyEqualityComparer()); 
+0

hi Josh , intenté esto: 'public bool Equals (ShowData x, ShowData y) { // Compruebe si los objetos comparados hacen referencia a los mismos datos. if (Object.ReferenceEquals (x, y)) return true; // Compruebe si alguno de los objetos comparados es nulo. if (Object.ReferenceEquals (x, null) || Object.ReferenceEquals (y, null)) return false; // Compruebe si las propiedades de los productos son iguales. return x.HashData == y.HashData; } ' – user1112324

+0

pero no estoy seguro de cómo se compila esto a medida que obtengo un error: iEnumerable no contiene una definición para Intersecar – user1112324

+0

@ user1112324 - ¿Estás seguro de que has incluido una instrucción 'using' para 'System.Linq' y ' System.Collections.Generic '? Intersecar es sin duda un método de extensión de IEnumerable . –

1

Algo como esto podría funcionar (advertencia no probado):

private IEnumerable<ShowData> xyz(List<ShowData> aObj, List<ShowData> bObj) 
{ 
    return aObj.Where(sd1 => bObj.Select(sd2 => sd2.HashData).Contains(sd1.HashData)); 
} 
+0

Hola, probé esto más arriba, pero obtengo resultados diferentes cuando recorro los dos conjuntos y cuento las coincidencias (recording.HashData == actual.HashData) versus cuando ejecuto el método anterior: IEnumerable contiene = xyz (ShowData, recordingPoints); int returned = contains.Contar(); – user1112324

+0

podría ser porque su método solo obtiene los valores únicos (es decir, si ya está en el conjunto que lo devuelve no lo ha leído). Necesito que sea readded incluso si ya está allí. – user1112324

+0

La respuesta de Josh probablemente funcionará mejor para sus propósitos (aunque no estoy seguro si Intersect solo proporciona resultados Distinct o no). –

Cuestiones relacionadas