2011-12-01 12 views
6

Mam listę działań. W klasie Activity jest właściwość ID (Guid for sake argumenty). Chcę sprawdzić, czy ta lista zawiera w sobie Aktywność z moim Guid. Zamiast tego:Korzystanie .Content() na właściwość w liście

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

Czy jest bardziej efektywny sposób, aby osiągnąć ten sam rezultat, jak tylko mogłem, gdybym miał tylko listę GUID (zamiast listy Aktywność użytkownika) i używać .Contains() ?

Mam listę struct o nazwie ActivityAndPO. W tej strukturze jest Guid. Mam listę zamówień. W klasie PO jest Guid.

Chcę przechodzić przez wszystkie obiekty na liście ActivityAndPO, gdzie Guid istnieją na liście PO.

Odpowiedz

8

pewien.

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

Ale ponieważ Id implikuje nie będzie co najwyżej 1 działalność:

//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

Spójrz do LINQ, można zamienić z nim swój kod przez: ActivityList.Any(i => i.Id == GuidToCompare);

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

// Code here 

} 
0

Tylko po to, aby zaoferować Wam wszystkie możliwości napisania tego zapytania za pomocą Linq

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

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

Teraz to do ciebie, aby wybrać bardziej czytelny fragment;)

1

Jeśli szukasz tylko jeden identyfikator jednym czasie, nie ma bardziej wydajny sposób.

Jeśli szukasz identyfikatorów wielokrotnie można zbudować HashSet:

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

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

Jeśli trzeba znaleźć instancję aktywności można zbudować słowniku (działa tylko wtedy, gdy identyfikator jest niepowtarzalny):

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

Inne rozwiązanie używające Linq z Where/FirstOrDefault/Any na Id nie będzie bardziej wydajne niż twoje.

1

znaleźć wszystkie obiekty z danej aktywności GUID można użyć:

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

Dla tych, którzy nie mogą korzystać z LINQ:

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

foreach (Activity activity in ActivityList.FindAll(delegate(Activity a) 
    { 
     return a.Id == GuidToCompare; 
    })) 
{ 
    //Code here 
} 
Powiązane problemy