2009-01-08 11 views

Respuesta

16

Sí - 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); 
} 

(En LINQ a SQL esto termina como una consulta de "IN".)

Tenga en cuenta que en LINQ a Objetos lo anterior no es realmente muy eficiente. Usted sería mejor con una combinación: (. Esto todavía podría hacerse con la notación de punto, por supuesto, pero que termina siendo un poco más desordenado)

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

+0

¡Gracias! Tu reputación te precede ;-) –

+0

¿Por qué la unión interna no se prefiere aquí? Usted sabe si la gente contiene 10 registros y deseaNombres contiene 2, se repetirá 20 veces en segundo plano, independientemente de que haya coincidencia o no. – Pankaj

+0

@PankajGarg: Por favor, no moleste así: no siempre podré responder de inmediato. ¿Leíste la parte inferior de mi publicación que explícitamente decía que en LINQ to Objects un join sería mejor? –

0

voy a ir a por combinación interna en este contexto. Si hubiera usado contains, se repetiría 6 veces a pesar de que haya solo dos coincidencias. Solo quiero enfatizar aquí que iré por uniones en lugar de un predicado 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(); 
Cuestiones relacionadas