2009-12-10 5 views
0

Je dois rechercher une liste de chaînes dans CityList et si elle contient toutes les chaînes de recherche , elle devrait renvoyer true sinon false.Linq Matching Pattern

Lorsque je recherche "London", "Dallas" contre CityList, il doit retourner false, car "Dallas" est manquant dans CityList.

var CityList=new string[] { "London","Paris","Houston","Mexico","Budapest"} 

var search =new string[] {"London","Dallas"}; 

Comment réécrire les éléments suivants?

var result = CityList.Select(c => c).ToList().FindAll(search.ToArray()); 

Répondre

4

Effectuez les opérations suivantes:

var hasAll = !search.Except(CityList).Any(); 

Par ailleurs, vous ne devriez jamais écrire something.Select(c => c); une telle déclaration ne fera que rendre le programme un peu plus lent.

+3

C'est la bonne réponse, mais dans l'autre sens (elle renvoie false si certains termes de recherche sont dans CityList, et vrai sinon). Donc: ! search.Except (CityList) .Any(); –

+0

Fixe; Je vous remercie. – SLaks

+0

retourner quelque chose.Sélectionner (c => c); est très utile lorsque vous voulez renvoyer un IEnumerable à partir d'une liste, Collection n'importe quoi sans retourner l'objet réel. Je l'utilise tout le temps. –

2

Qu'un assez facile une

search.All(c => CityList.Contains(c)) 

Tout ne fera que satify lorsque tous les prédicats retour vrai, nous vérifions si le citylist contient l'élément

+0

Mon chemin est plus rapide, puisque 'Except' va construire une table de hachage. – SLaks

+0

Où obtenez-vous cela? –

+0

Réflecteur (Bêta) – SLaks

3

Essayez ceci:

var result = search.All(s => CityList.Contains(s)); 
3

Vous avoir différentes possibilités:

var result = CityList.Union(search).Count() == CityList.Count(); 
var result2 = search.All(s => CityList.Contains(s)); 
var result3 = search.ToList().TrueForAll(s => CityList.Contains(s)); 
var result4 = CityList.Intersect(search).Count() == search.Count(); 
+0

La première méthode ne fonctionnera pas si 'CityList' a des éléments en double. – SLaks