Mam dwa zestawy danych (listy złożonych obiektów lub danych SQL - LINQ do encji), w których im próbuje znaleźć przecięcie dwóch zestawów danych. Konkretnie skrzyżowanie nieruchomości Complex „HashData” jak widać poniżej:Przecięcie dwóch zestawów (list) danych
Zestaw po lewej to prawdopodobnie około 10000 wierszy, podczas zbioru po prawej stronie jest zawsze podzbiorem około 100 wydziwianie. Zdaję sobie sprawę, że jeśli posortuję zestaw po lewej stronie "Hashdata" podczas jego przechowywania, wyszukiwanie będzie dużo szybsze przy użyciu jakiegoś algorytmu binarnego wyszukiwania, jednak nie mogę tego zrobić z powodów niezwiązanych z pytaniem.
Mniejszy podzbiór danych nigdy nie jest przechowywany w SQL (pokazany tylko w poniższej tabeli SQL w celach wyjaśniających). Jest prezentowany w List<ShowData>
w czasie wykonywania.
W tej chwili robię żałosne pętlę poprzez danych i dopasowanie następująco (gdzie recording
lista 100 wierszy i ShowData
lista 10000 wiersz):
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) {
}
}
}
Więc w zasadzie to, co im próbuje Aby to zrobić, należy:
Zwrócić listę obiektów ShowData (duży zestaw), gdzie dowolne dane HashData (z małego zestawu) znajdują się w ShowData, ale w LINQ do obiektu początkowego zapytania do bazy danych.
mam blisko z:
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);
}
hi Josh , próbowałem to: 'public bool równa się (ShowData x, ShowData y) { // Sprawdź, czy porównywane obiekty odnoszą się do tych samych danych. if (Object.ReferenceEquals (x, y)) zwraca wartość true; // Sprawdź, czy żaden z porównywanych obiektów nie jest pusty. if (Object.ReferenceEquals (x, null) || Object.ReferenceEquals (y, null)) return false; // Sprawdź, czy właściwości produktów są takie same. return x.HashData == y.HashData; } ' – user1112324
ale nie jestem pewien jak to się kompiluje, gdy pojawia się błąd: iNumerumer nie zawiera definicji dla Intersect –
user1112324
@ user1112324 - Czy jesteś pewien, że umieściłeś instrukcję 'using' dla 'System.Linq' i ' System.Collections.Generic? Przecięcie jest z pewnością metodą rozszerzenia IEnumerable. –