2010-10-12 4 views
9

donné une collection de la classe suivante:LINQ: ... Où (x => x.Contains (chaîne commençant par "foo"))

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

est-il un moyen facile d'obtenir tous Post s qui contiennent un tag commençant par "foo" en utilisant 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 doit maintenant contenir des articles 1 et 3 de posts.

+0

Merci à tous! Est-il possible de faire le cas "StartsWith comparaison" insensible? – davehauser

+0

Utilisez 'StringComparison.OrdinalIgnoreCase'. J'ai mis à jour ma réponse. – BrunoLM

Répondre

15

Utiliser la chaîne de StartsWith

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

x.Any vérifiera si un élément correspond à une condition. StartsWith vérifie si l'élément commence par une certaine chaîne.

ci-dessus retourné:

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

Pour le rendre cas insensitive utilisation StringComparison.OrdinalIgnoreCase.

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

Retours:

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

tandis que StartsWith("FoO") renvoie aucun résultat.

+0

+1 et la réponse acceptée pour les informations supplémentaires et l'exemple insensible à la casse. Merci! – davehauser

+0

... et je pensais que j'étais si intelligent quand j'ai créé un 'StartsWithComparer' – jrsconfitto

8

Essayez ceci:

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

Je crois que cela fonctionnera pour ce que vous essayez de faire.

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

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

Questions connexes