2011-06-12 23 views
5

den listesi aldıktan İki koleksiyon vardır: biri Öğeler Ve başka bir ActiveItemsLinq başka bir listeye

bu iki koleksiyon arasındaki tek kavşak Adı

olduğunu ben Öğeler nerede Öğeler gelen Linq ile listesini istiyorum muhtemelen bir dizi yaratacak

Items.Where(i => ActiveItems.Count(v=> v.Name==i.Name) > 0) 

cevap

11

: isimler bu kod daha iyi bir fikir olduğunu yazdı

bu adla ActiveItems içindedir

var activeNames = new HashSet<string>(activeItems.Select(x => x.Name)); 
var itemsWithActiveNames = items.Where(x => activeNames.Contains(x.Name)) 
           .ToList(); 

Diğer bir seçenek, birleştirme, örneğin kullanmaktır: o ActiveItems isimleri ve kullanan Aynı ada sahip birden ActiveItem değerleri varsa bu yinelenen item değerleri vereceğini

var query = from activeItem in activeItems 
      join item in items on activeItem.Name equals item.Name 
      select item; 

Not: Bir sorgu ifadesi ile. Başka bir alternatif bu sorunu yok ki, katılmak ama biraz sakar geçerli: bunların hepsi adları denetlemek O (N * M) önlemek olacaktır

var query = from item in items 
      join activeItem in activeItems 
       on item.Name equals activeItem.Name 
       into g 
      where g.Any() 
      select item; 

Not - onlar olacak tüm kullanım hash tabloları arkasında O (N + M) karmaşıklığı vermek için sahneler.

+0

Hayır Senin için ilk cevap en iyi teşekkür olduğunu düşünüyorum başka bir koleksiyondan –

+0

gelen özelliklerini istemediğiniz bir sürü 1 –

+0

olacak çözümler 2 ve 3 HashSets'i "activeNames" olmaksızın dahili olarak kullanmak? – Magnus

4
Items.where(i => ActiveItems.Any(a => i.Name == a.Name)) 
0
var results = from i1 in collection1.Items 
       join i2 in collection2.ActiveItems on i1.Name equals i2.Name 
       select i2.Name; 
0

Kullanarak katılmak:

from item in Items 
join active in ActiveItems on item.Name equals active.Name 
select item 
+0

katılım öğesi ... item.Name eşittir aktif.Name. Sıra önemlidir – slfan

İlgili konular