2011-12-01 16 views
6

Ho un elenco di attività. Nella classe Activity è una proprietà ID (un Guid per argomento). Voglio controllare se questo elenco ha un'attività in esso con un Guid ho. Invece di questo:Utilizzo di .Contains() su una proprietà in un elenco

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

C'è un modo più efficiente per ottenere lo stesso risultato, come ho potuto, se dovessi avere solo un elenco di GUID (invece di un elenco di attività di) e di utilizzare .Contains() ?

Ho una lista di una struttura chiamata ActivityAndPO. In questa struttura è una guida. Ho una lista di PO. Nella classe PO è una guida.

Voglio scorrere tutti gli oggetti nell'elenco ActivityAndPO in cui sono presenti i Guid nell'elenco di PO.

risposta

8

Certo.

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

Ma poiché Id implica ci saranno al massimo 1 attività:

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

Date un'occhiata al LINQ, è possibile sostituire con esso il codice da: ActivityList.Any(i => i.Id == GuidToCompare);

1
foreach(var activity in ActivityList.Where(p=>p.Id == GuidToCompare)) 
{ 

// Code here 

} 
0

Solo per offrirti tutti i modi in cui puoi scrivere questa query con Linq

var result = (from activity in activityList 
       where activity.Id == GuidToCompare 
       select activity).FirstOrDefault(); 

if(result != null) 
    /* Code here */ 

Ora, spetta a voi scegliere il frammento più leggibile;)

1

Se siete alla ricerca di un unico ID una volta, non c'è modo più efficiente.

Se siete alla ricerca di Ids più volte si può costruire un HashSet:

var activityIdsQuery = from a in ActivityList 
         select a.Id; 
HashSet<Guid> activityIds = new HashSet<Guid>(activityIdsQuery); 

//Use the hashset 
activityIds.Contains(id); 

Se hai bisogno di trovare un esempio di attività che si può costruire un dizionario (funziona solo se Id è unico):

Dictionary<Guid, Activity> activities = ActivityList.ToDictionary(a => a.Id); 

Altre soluzioni che utilizzano Linq con Where/FirstOrDefault/Any sull'Id non saranno più efficienti delle vostre.

1

per trovare tutti gli oggetti di attività con il dato GUID è possibile utilizzare:

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

Per coloro che non possono utilizzare LINQ:

List<Activity> ActivityList = new List<Activity>(); 

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