2013-04-22 2 views
5

Mam słownika, gdzie kluczem jest identyfikator, a wartość jest ciągiemCzy C# ma metodę ContainsAny() dla słownika?

teraz mam listę osobę obiektów, gdzie każdy człowiek ma właściwość CarIds że jest

IEnumerable<int> 

chcę zasadniczo filtruj listę obiektów, aby zawierały tylko te elementy, w których jedna z właściwości jest zawarta w dykcie.

Na przykład. coś takiego:

var dictionary = GetDict(); 

var people = GetPeople(); 

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

Czy coś takiego istnieje, gdzie mogę zrobić coś podobnego do containsKey(), ale sprawdzić każdy na liście wskazówki?

+0

Pedantyczny: C# nie ma nawet słowniki, a tym bardziej metod takich jak ContainsAny. .NET ma słowniki i mógł mieć taką metodę. –

Odpowiedz

5

Tak, można spróbować na listach:

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

Do słowników, można użyć tego:

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

dzięki. jedno ulepszenie, ponieważ wygląda na to, że potrzebuję list.Keys.Intersect ze względu na jego słownik. – leora

+0

@leora Spróbuj aktualizacji, powinna działać szybciej niż "Przecięcie". – dasblinkenlight

+0

Nie podążam za zaktualizowaną odpowiedzią, wydaje się, że powracasz, ale robisz test! = 0. . – leora

6

najlepiej jest prawdopodobnie rozszerzyć słowniku (które prawdopodobnie powinny mieć ContainsAny() lub 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; 
} 

a to może być linq'd jak:

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