2011-07-26 7 views
10

Mam dwie ogólne listy zawierające różne typy, dla przykładu, możemy je nazwać Products i Employees. Próbuję znaleźć produkty, które są oparte na tym samym miejscu, co pracownicy, czyli gdzie product.SiteId == emp.SiteIdCo to jest "nowoczesny" sposób na znalezienie wspólnych przedmiotów w dwóch listach obiektów: <T>?

List<Product> lstProds; 
List<Employees> lstEmps; 

My (old skool) mózg mówi mi użyć forEach pętlę znaleźć mecze, ale podejrzewam, że nie jest a ("lepiej"/terser/szybciej?) sposób zrobić to za pomocą Linq. Czy ktoś może mnie oświecić? Wszystkie przykłady, które znalazłem w Internecie, zawierają Listy prymitywów (ciągi/znaki) i nie są szczególnie pomocne.

Odpowiedz

17

powiedziałbym:

var products = from product in lstProds 
       join employee in lstEmps on product.SiteId equals employee.SiteId 
       select product; 

Jednakże, jeśli istnieją wiele pracownicy z tego samego identyfikatora witryny, dostaniesz produkty razy kilka. Można użyć Distinct to naprawić, lub zbudować zestaw identyfikatorów strony:

var siteIds = new HashSet<int>(lstEmps.Select(emp => emp.SiteId)); 

var products = lstProds.Where(product => siteIds.Contains(product.SiteId)); 

Zakładając SiteId jest int - jeśli jest to anonimowy typ lub coś podobnego, może chcesz dodatkową metodę rozszerzenia:

public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source) 
{ 
    return new HashSet<T>(source); 
} 

Następnie:

var siteIds = lstEmps.Select(emp => emp.SiteId).ToHashSet(); 
var products = lstProds.Where(product => siteIds.Contains(product.SiteId)); 

Ewentualnie, jeśli masz kilku pracowników, to będzie działać, ale jest stosunkowo powolny:

var products = lstProds.Where(p => lstEmps.Any(emp => p.SiteId == emp.SiteId)); 

Dodaj ToList wezwanie do żadnej z tych metod, aby uzyskać List<Product> zamiast IEnumerable<Product>.

+0

Dziękuję bardzo Panu Skeet. – 5arx

+0

Musiałem zmodyfikować nieco składnię, aby działało - użycie == do sprawdzenia, czy równość jest, oczywiście, nie jest poprawna? VS mówi mi, że "oczekiwane słowo kluczowe" jest równe ". Zastąpienie znaku == równaniami wydaje się być pomocne, ale w tym momencie nie mam pojęcia, dlaczego? Czy mógłbyś rozwinąć proszę ...? – 5arx

+1

@ 5arx: Przepraszam, tak, naprawione. To tylko część składni wyrażeń zapytania - nie jesteś * właściwie * dostarczając pojedyncze wyrażenie ('product.SiteId == employee.SiteId'), aby sprawdzić każdą parę. Zamiast tego podajesz dwie prognozy ('product.SiteId' i' employee.SiteId'), które są stosowane do każdego elementu każdej strony * raz *, a następnie porównywane są klucze dla równości. –

Powiązane problemy