Utiliser .Contains () sur une propriété dans une liste

J’ai une liste d’activités. Dans la classe d’activité se trouve une propriété ID (un Guid pour les arguments). Je veux vérifier si cette liste contient une activité avec un GUID que j’ai. Plutôt que cela:

foreach(Activity activity in ActivityList) { if(activity.Id == GuidToCompare) //Code here } 

Existe-t-il un moyen plus efficace d’obtenir le même résultat que possible si je n’avais qu’une liste de guids (au lieu d’une liste d’activités) et que j’utilisais .Contains ()?

J’ai une liste d’une structure appelée ActivityAndPO. Dans cette structure est un Guid. J’ai une liste de bons de commande. Dans la classe PO est un Guid.

Je veux parcourir tous les objects de la liste ActivityAndPO où les Guid existent dans la liste des bons de commande.

Sûr.

 foreach(Activity activity in ActivityList.Where(a => a.Id == GuidToCompare) ) { //Code here } 

Mais puisque Id implique qu’il y aura au plus 1 activité:

 //var act = ActivityList.Where(a => a.Id == GuidToCompare).SingleOrDefault(); // clearer var act = ActivityList.SingleOrDefault(a => a.Id == GuidToCompare); // shorter if (act != null) { //Code here } 

Regardez le LINQ, vous pouvez y remplacer votre code par: ActivityList.Any(i => i.Id == GuidToCompare);

 foreach(var activity in ActivityList.Where(p=>p.Id == GuidToCompare)) { // Code here } 

pour trouver tous les objects d’activité avec le GUID donné, vous pouvez utiliser:

 var results = ActivityList.FindAll(item => item.ID == GuidToCompare); 

Si vous recherchez une seule identité une fois, il n’y a pas de moyen plus efficace.

Si vous recherchez plusieurs fois des ID, vous pouvez créer un hachage:

 var activityIdsQuery = from a in ActivityList select a.Id; HashSet activityIds = new HashSet(activityIdsQuery); //Use the hashset activityIds.Contains(id); 

Si vous avez besoin de trouver une instance d’activité, vous pouvez créer un dictionnaire (ne fonctionne que si l’identifiant est unique):

 Dictionary activities = ActivityList.ToDictionary(a => a.Id); 

Les autres solutions utilisant Linq avec Where / FirstOrDefault / Any sur l’ID ne seront pas plus efficaces que le vôtre.

Je ne l’ai pas testé mais je suis assez sûr que cela devrait marcher:

 if ( ActivityList.Any ( a => a.Id == GuidToCompare ) ) { // TODO - Exists. } 

MSDN Any: http://msdn.microsoft.com/en-us/library/bb534972.aspx

Juste pour vous offrir tous les moyens d’écrire cette requête avec Linq

 var result = (from activity in activityList where activity.Id == GuidToCompare select activity ).FirstOrDefault(); if(result != null) /* Code here */ 

À vous maintenant de choisir l’extrait le plus lisible;)

Pour ceux qui ne peuvent pas utiliser LINQ:

 List ActivityList = new List(); foreach (Activity activity in ActivityList.FindAll(delegate(Activity a) { return a.Id == GuidToCompare; })) { //Code here }