2010-10-12 30 views
9

Dada una colección de la clase siguiente:LINQ: ... donde (x => x.Contains (cadena que comienzan por "foo"))

public class Post 
{ 
    ... 
    public IList<string> Tags { get; set; } 
} 

¿Hay una manera fácil de obtener toda Post s que contienen una etiqueta que comienza con "foo" utilizando LINQ?

var posts = new List<Post> 
{ 
    new Post { Tags = new[] { "fooTag", "tag" }}, 
    new Post { Tags = new[] { "barTag", "anyTag" }}, 
    new Post { Tags = new[] { "someTag", "fooBarTag" }} 
}; 

var postsWithFooTag = posts.Where(x => [some fancy LINQ query here]); 

postsWithFooTag debe contener ahora los puntos 1 y 3 de posts.

+0

Gracias a todos! ¿Existe la posibilidad de hacer la comparación "StartsWith" insensible? – davehauser

+0

Use 'StringComparison.OrdinalIgnoreCase'. He actualizado mi respuesta. – BrunoLM

Respuesta

15

comprobará Uso de StartsWith

var postsWithFooTag = posts.Where(x => x.Tags.Any(y => y.StartsWith("foo"))); 

x.Any cadena si cualquier elemento coincide con alguna condición. StartsWith comprueba si el elemento comienza con una cierta cadena.

Lo anterior devueltos:

new Post { Tags = new[] { "fooTag", "tag" }}, 
new Post { Tags = new[] { "someTag", "fooBarTag" }} 

Para que sea el caso insensitive uso StringComparison.OrdinalIgnoreCase.

var postsWithFooTag = posts.Where(x => x.Tags.Any(y => y.StartsWith("FoO", StringComparison.OrdinalIgnoreCase))); 

Devuelve:

new Post { Tags = new[] { "fooTag", "tag" }}, 
new Post { Tags = new[] { "someTag", "fooBarTag" }} 

mientras StartsWith("FoO") sin resultados.

+0

+1 y respuesta aceptada para la información adicional y el ejemplo insensible a mayúsculas y minúsculas. ¡Gracias! – davehauser

+0

... y pensé que era tan inteligente cuando creé un 'StartsWithComparer' – jrsconfitto

8

Prueba esto:

var postsWithFooTag = posts.Where(x => x.Tags.Any(y => y.StartsWith("foo"))) 
2

creo que esto funcionará para lo que estamos tratando de hacer.

posts.Where(p => p.Tags.Any(t => t.StartsWith("foo")))

2
var tag = "foo"; 
var postsWithFooTag = 
    posts.Where(p=> p.Tags.Any(t => t.StartsWith(tag))); 
2

Trate x => x.Tags.Any(tag => tag.StartsWith("foo"))

Cuestiones relacionadas