2010-07-05 31 views
24

içinde var, ben bunu yapabilirsiniz:lambda ifadesi listesinde

list.Where(r => r.Id == idToCompare); 

Ya, yerine tek idToCompare, ben kimlikleri listesi var karşılaştırmak için?

Önceden tanımlanmış bir listeyle karşılaştırmanın sözdizimi nedir? şöyle birşey: listOfIds listesidir

int[] listofIds = GetListofIds(); 

list.Where(r => r.Id "in listofIds"); 

cevap

46

, bu (List.Contains çalışır, ancak) doğrusal bir arayıştır, bu nedenle bu korkunç verimli değildir.

Set gibi arama yapmak için uygun bir konteynere bakmak istediğiniz kimlikleri saklamaktan daha iyidir.

List<int> listOfIds = new List(GetListOfIds()); 
lists.Where(r=>listOfIds.Contains(r.Id)); 
4
Sen İçeren kullanabilirsiniz

() uzantısı yöntemi:

list.Where(r => listofIds.Contains(r.Id)) 
19
var query = list.Where(r => listofIds.Any(id => id == r.Id)); 

başka bir yaklaşım, kullanışlı listOfIds dizisi büyükse:

HashSet<int> hash = new HashSet<int>(listofIds); 
var query = list.Where(r => hash.Contains(r.Id)); 
+2

Varlık çerçeve kullanılır (ve muhtemelen LINQ-To-SQL), bu aslında tercüme edecek "SEÇ * (1, 2, 3, 4) kimliğinin bulunduğu tablodan, sunucuya yalnızca bir seferle sonuçlanır. –

+0

@IgorZevaka - DB'yi EF kullanarak sorgulayacaksa, SortedSet'i (HashSet'in bir üst kümesidir) kullanmayı tercih edeceğim. HashSet gibi benzersiz, ama aynı zamanda Sıralı. Sonra 'where' maddesini çalıştıracağım Db sütunumu indeksleyeceğim. Bu, büyük verilerde önemli ölçüde daha hızlı olacaktır. – sandiejat

0

ben bakardım Katıl operatör:

from r in list join i in listofIds on r.Id equals i select r 

Bunun, Yöntemler yöntemine göre nasıl optimize edileceğinden emin değilim, ancak en azından derleyiciye yapmaya çalıştığınız şey hakkında daha iyi bir fikir verir. Ayrıca, elde etmeye çalıştığınız şeylere yarı yakındır.

Düzenleme: (ı çözdüm şimdi) şeyiyle Uzatma yöntemi sözdizimi:

var results = listofIds.Join(list, i => i, r => r.Id, (i, r) => r); 
+1

Aynı cevabı yayınlamak üzereydim (uzatma yöntemi sözdizimini kullanarak olsa da, bu sadece kişisel tercihtir). Ve evet, 'join'' '' '' '' '' 'listesindeki her üye için' listOfIds' içinde sıralı bir arama yapmak yerine, her iki taraftaki tuşların bir bellek içi karma tablosu oluşturduğu için '' '' 'Contains''dan daha optimize edilir. –

+0

@Anthony Pegram: Teşekkürler, sadece anladım ve yorumumu sildim, üzgünüm. Referans için, sözdizimini anlayamadım ve yardım istedim dedim – TheEvilPenguin