2009-01-08 38 views

Trả lời

16

Có - 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); 
} 

(Trong LINQ to SQL này kết thúc lên như một "IN" truy vấn.)

Lưu ý rằng trong LINQ to Objects ở trên là không thực sự rất hiệu quả. Bạn muốn được tốt hơn off với một tham gia: (. Điều này vẫn có thể được thực hiện với ký hiệu dấu chấm tất nhiên, nhưng nó kết thúc lên được phần nào Messier)

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

+0

Cảm ơn bạn! Danh tiếng của bạn đứng trước bạn ;-) –

+0

Tại sao kết nối bên trong không được ưu tiên ở đây? Bạn biết nếu những người có 10 hồ sơ và mong muốnNames chứa 2, nó sẽ lặp lại 20 lần trong nền, không phân biệt thực tế là liệu có một trận đấu hay không. – Pankaj

+0

@PankajGarg: Xin đừng pester như thế này - Tôi sẽ không luôn có thể trả lời ngay lập tức. Bạn đã đọc phần dưới cùng của bài viết của tôi mà rõ ràng nói rằng trong LINQ to Objects một tham gia sẽ tốt hơn? –

0

Tôi sẽ đi cho Inner Tham gia trong này bối cảnh. Nếu tôi đã sử dụng contains, nó sẽ lặp lại 6 lần mặc dù nếu thực tế là chỉ có hai trận đấu. Tôi chỉ muốn nhấn mạnh ở đây rằng tôi sẽ đi cho Joins thay vì IN predicate.

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(); 
Các vấn đề liên quan