2009-01-08 12 views

Odpowiedz

16

Tak - Contains.

var desiredNames = new[] { "Jon", "Marc" }; 

var people = new[] 
{ 
    new { FirstName="Jon", Surname="Skeet" }, 
    new { FirstName="Marc", Surname="Gravell" }, 
    new { FirstName="Jeff", Surname="Atwood" } 
}; 

var matches = people.Where(person => desiredNames.Contains(person.FirstName)); 

foreach (var person in matches) 
{ 
    Console.WriteLine(person); 
} 

(w LINQ to SQL to kończy się jako "w" zapytaniu.)

pamiętać, że w LINQ to Objects powyższe nie jest naprawdę bardzo skuteczny. Byłbyś lepiej z złączenia: (. To może wciąż być wykonane z notacji dot oczywiście, ale to kończy się nieco Messier)

var matches = from person in people 
       join name in desiredNames on person.FirstName equals name 
       select person; 

+0

Dziękujemy! Twoja reputacja Cię wyprzedza ;-) –

+0

Dlaczego wewnętrzne połączenie nie jest tutaj preferowane? Wiesz, że jeśli ludzie zawierają 10 rekordów, a desiredNames zawiera 2, to będzie iterować 20 razy w tle, niezależnie od tego, czy istnieje dopasowanie, czy nie. – Pankaj

+0

@PankajGarg: Proszę nie dręczyć w ten sposób - nie zawsze będę w stanie odpowiedzieć natychmiast. Czy przeczytałeś w dolnej części mojego posta, który wyraźnie powiedział, że w LINQ to Objects join byłby lepszy? –

0

pójdę do Inner Join w ten kontekst. Gdybym użył contains, iterowałbym 6 razy, pomimo faktu, że są tylko dwa mecze. Chcę tylko podkreślić tutaj, że wybiorę Joins zamiast IN.

var desiredNames = new[] { "Pankaj" }; 

var people = new[] 
{ 
    new { FirstName="Pankaj", Surname="Garg" }, 
    new { FirstName="Marc", Surname="Gravell" }, 
    new { FirstName="Jeff", Surname="Atwood" } 
}; 

var records = (from p in people join filtered in desiredNames on p.FirstName equals filtered select p.FirstName).ToList(); 
Powiązane problemy