2011-12-22 20 views
6

Ho due serie di dati (elenchi di oggetti complessi o dati SQL - LINQ a entità) dove sto cercando di trovare l'intersezione dei due insiemi di dati. Specificamente un'intersezione della proprietà Complesso, "HashData" come mostrato di seguito:Intersezione di due set (liste) di dati

SQL data

Il set a sinistra è probabile che sia circa 10000 righe, mentre la serie destra è sempre un sottoinsieme di circa 100 filari. Mi rendo conto che se I sorta il set a sinistra da "Hashdata" quando lo si ripone, facendo una ricerca sarebbe un bel po 'più veloce utilizzando una sorta di algoritmo di ricerca binaria, tuttavia non posso fare questo per motivi non pertinenti alla domanda.

Il sottoinsieme di dati più piccolo non viene mai memorizzato in SQL (mostrato solo in una tabella SQL di seguito per scopi esplicativi). È presentato in un List<ShowData> in fase di esecuzione.

Al momento sto facendo un ciclo patetico attraverso i dati e la congruenza come questo (dove recording è la lista di 100 riga e ShowData l'elenco 10000 riga):

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) { 
     } 
    } 
} 

Quindi, in pratica quello che im cercando da fare è:

Restituisce un elenco di oggetti ShowData (big set) in cui qualsiasi HashData (dal piccolo insieme) viene trovato in ShowData BUT all'interno della query iniziale LINQ su Entity sul DB.

mi sono avvicinato 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); 
    } 

risposta

6

Dal momento che si sta utilizzando IEnumerable, è possibile utilizzare il metodo Intersect estensione al posto di Join. Se si desidera restituire il set grande, si vorrà intersecare il risultato della query big set con il set più piccolo. Si avrebbe bisogno di scrivere un IEquality Comparer come illustrato di seguito: http://msdn.microsoft.com/en-us/library/bb355408.aspx per confrontare gli oggetti, quindi chiamare il metodo Intersect estensione:

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

hi Josh , ho provato questo: 'public bool Equals (ShowData x, ShowData y) { // Controlla se gli oggetti confrontati fanno riferimento agli stessi dati. if (Object.ReferenceEquals (x, y)) restituisce true; // Controlla se uno qualsiasi degli oggetti confrontati è nullo. se (Object.ReferenceEquals (x, null) || Object.ReferenceEquals (y, null)) return false; // Controlla se le proprietà dei prodotti sono uguali. return x.HashData == y.HashData;} ' – user1112324

+0

ma non sono sicuro di come si compila quando ottengo un errore: iEnumerable non contiene una definizione per Intersect – user1112324

+0

@ user1112324 - Sei sicuro di aver incluso un'istruzione 'using' per 'System.Linq' e ' System.Collections.Generic '? Intersect è sicuramente un metodo di estensione di IEnumerable . –

1

Qualcosa di simile potrebbe funzionare (avvertimento non testata):

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

Ciao, ho provato questo sopra, ma ottengo risultati diversi per quando iterare attraverso i due set e contare le partite (recording.HashData == actual.HashData) contro quando eseguo il metodo sopra: IEnumerable contiene = xyz (ShowData, recordingPoints); int restituito = contiene.Contare(); – user1112324

+0

potrebbe essere il motivo per cui il metodo ottiene solo i valori univoci (cioè se è già nel set di reso non lo ha letto). ho bisogno che venga letto anche se è già lì – user1112324

+0

La risposta di Josh funzionerà probabilmente meglio per i tuoi scopi (anche se non sono sicuro che Intersect fornisca solo risultati distinti o no). –

Problemi correlati