2011-07-26 14 views
10

Farklı türler içeren iki Genel Listeleme sahibim, örneğin, Products ve Employees olarak adlandırın. Ben Çalışan aynı yerde dayanır Ürünleri, bulmaya çalışıyorum yani nereye product.SiteId == emp.SiteIdNesnelerin iki listesinde <T> listelerinde ortak öğeleri bulmanın 'modern' yolu nedir?

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

Benim (old skool) beyin eşleşmeleri bulmak için bir forEach döngü kullanmak beni anlatıyor ama orada şüpheli Linq kullanarak yapmak için bir ('daha iyi'/terser/daha hızlı?) yolu. Birisi beni aydınlatabilir mi? Çevrimiçi bulduğum tüm örnekler ilkel listeler (dizeler/in'ler) ile ilgilenir ve özellikle yararlı değildir.

cevap

17

söyleyebilirim:

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

Ancak, aynı site kimliğini birden çalışanı varsa, sen ürünler birden çok kez elde edersiniz.

: o anonim bir türü veya benzeri bir şey varsa, fazladan uzatma yöntemi isteyebilirsiniz - SiteId farz ediyor

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

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

bir int şudur: Bunu düzeltmek veya site kimlikleri grubu oluşturmak için Distinct kullanabilirsiniz

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

Ardından: Eğer birkaç çalışanı varsa

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

Alternatif, işe yarayacak ama yavaş nispeten geçerli:

var products = lstProds.Where(p => lstEmps.Any(emp => p.SiteId == emp.SiteId)); 
yerine IEnumerable<Product> bir List<Product> almak için bu yaklaşımların herhangi bir ToList Çağrı ekle.

+0

Çok teşekkür ederim Bay Skeet. – 5arx

+0

Çalışmak için sözdizimini biraz değiştirmem gerekiyordu - == kullanarak eşitlik testi, görünüşte doğru değil mi? VS bana 'bağlamsal anahtar kelimesi' eşittir '' beklemesini söylüyor. == ile eşittir, hile yapmak gibi görünüyor, ama bu noktada neden hiçbir fikrim yok? Lütfen detaylandırır mısınız? – 5arx

+1

@ 5arx: Üzgünüm, evet, düzeltildi. Bu, yalnızca sorgu ifadesi sözdiziminin bir parçası - her çiftin kontrol edilmesi için * aslında * tek bir ifade ('product.SiteId == employee.SiteId') sağlamanız değil. Bunun yerine, her bir yüzeye * bir kez * uygulanmış olan iki projeksiyon ('product.SiteId' ve' employee.SiteId') sağladıktan sonra anahtarlar eşitlik açısından karşılaştırılır. –

İlgili konular