2013-04-22 13 views
5

Key bir kimliği olan bir sözlük var ve değeri her kişi İstiyorum birC# bir sözlük için ContainsAny() yöntemine sahip mi?

IEnumerable<int> 

bir CarIds özelliğine sahiptir

Şimdi sahip kişinin Liste nesneleri bir dizedir Temel olarak, yalnızca özelliklerden birinin taslakta yer aldığı öğeleri içerecek şekilde nesne listesini filtreleyin. Örneğin,

. Böyle bir şey:

var dictionary = GetDict(); 

var people = GetPeople(); 

people = people.Where(r => dictionary.ContainsAny(r.CarIds)).ToList(); 

böyle bir şey ben containsKey (benzer bir şeyler yapabiliriz nerede var) ama ints bir listede tümü için kontrol ediyor mu? Bunu kullanabilir, sözlüklerde için

people = people.Where(r => list.Intersect(r.CarIds).Count() != 0).ToList(); 

:

+0

bilgiçlik: C# dahi sözlükleri ContainsAny gibi çok daha az yöntemi yok. .NET'in sözlükleri vardır ve böyle bir yöntemi olabilir. –

cevap

5

Evet, listelerin bu deneyebilirsiniz

people = people.Where(r => r.CarIds.Any(n => dictionary.ContainsKey(n))).ToList(); 
+0

teşekkürler. bir tweak ben listeye ihtiyacım var gibi görünüyor.Keys.Intersect bir sözlük verilen – leora

+0

@leora Güncellemeyi deneyin, daha hızlı çalışmalıdır 'Intersect'. – dasblinkenlight

+0

Güncellenmiş cevabınızı takip etmiyorum, boole dönüyormuş gibi görünüyorsunuz, ama bir! = 0 kontrol yapıyorsunuz. . – leora

6

en iyi bahis muhtemelen Sözlük (uzatmak için hangi muhtemelen olması gerektiğini ContainsAny() veya ContainsAnyKey()).

public static bool ContainsAny<K, V>(
     this Dictionary<K, V> dict, IEnumerable<K> keys) 
{ 
    foreach(K key in keys) 
     if(dict.ContainsKey(key)) return true; 
    return false; 
} 

ve bu şekilde linq'd edilebilir:

public static bool ContainsAny<K, V>(
      this Dictionary<K, V> dict, IEnumerable<K> keys) 
    { return keys.Any(key => dict.ContainsKey(key)); } 
İlgili konular