2010-10-12 18 views
9

şu sınıfın bir koleksiyonu verilmiş: Tüm Post elde etmenin kolay bir yolu var mıLINQ: ... Nerede (x => x.Contains ("foo") ile başlayan dize)

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

LINQ kullanarak "foo" ile başlayan bir etiket içeren s?

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 şimdi öğeleri 1 ve posts 3. içermelidir.

+0

Teşekkür deneyin! "StartsWith karşılaştırması" büyük/küçük harfe duyarlı olma ihtimali var mı? – davehauser

+0

'StringComparison.OrdinalIgnoreCase' kullanın. Cevabımı güncelledim. – BrunoLM

cevap

15

herhangi eleman bazı koşulu eşleşirse Kullanım dize en StartsWith

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

x.Any kontrol edecektir. StartsWith, öğenin belirli bir dizeyle başlayıp başlamadığını denetler.

yukarıda döndürdü:

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

harf insensitive kullanım StringComparison.OrdinalIgnoreCase yapmak için.

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

İade:

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

StartsWith("FoO") ederken sonucunda sonuç yok.

+0

+1 ve ek bilgi ve büyük/küçük harf duyarsız örnek için cevap kabul etti. Teşekkürler! – davehauser

+0

... ve bir 'StartsWithComparer' oluşturduğumda çok akıllı olduğumu düşündüm – jrsconfitto

8

bu deneyin:

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

Bunu Yapmaya çalıştığınız şey için çalışacak inanıyoruz.

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

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

İlgili konular