2009-01-08 7 views

Antwort

16

Ja - 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); 
} 

(In LINQ to SQL das endet als "IN" Abfrage auf.)

Beachten Sie, dass in LINQ die oben ist nicht wirklich sehr effizient Objekte. Sie würden besser dran mit einem Join: (. Diese noch mit Punktnotation natürlich getan werden könnte, aber es endet als etwas unordentlicher up)

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

+0

Vielen Dank! Dein Ruf geht dir voraus ;-) –

+0

Warum wird der innere Join hier nicht bevorzugt? Sie wissen, wenn die Leute 10 Datensätze enthalten und selledNames 2 enthält, wird es 20 Mal im Hintergrund iterieren, unabhängig davon, ob es eine Übereinstimmung gibt oder nicht. – Pankaj

+0

@PankajGarg: Bitte nicht so nervös - ich werde nicht immer sofort antworten können. Hast du den unteren Teil meines Beitrags gelesen, der explizit gesagt hat, dass in LINQ to Objects ein Join besser wäre? –

0

I für Innere in dieser gehen Sie Mitglied Kontext. Wenn ich contains verwendet hätte, würde es 6 mal wiederholen, obwohl die Tatsache, dass es nur zwei Übereinstimmungen gibt. Ich möchte hier nur betonen, dass ich für Joins anstelle von IN Prädikat gehen werde.

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();