2011-12-01 2 views
6

У меня есть список видов деятельности. В классе Activity есть свойство ID (Guid для аргументов). Я хочу проверить, есть ли в этом списке Activity в нем с Guid, который у меня есть. Вместо этого:Использование .Contains() для свойства в списке

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

Есть ли более эффективный способ добиться того же результата, как я мог бы, если бы я должен был иметь только список Guids (вместо списка активности), и использовать .Contains() ?

У меня есть список структур под названием ActivityAndPO. В этой структуре находится Guid. У меня есть список PO. В классе PO есть Guid.

Я хочу перечеркнуть все объекты в списке ActivityAndPO, где Guid находятся в списке PO.

ответ

8

Sure.

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

Но поскольку Id подразумевает, что будет наиболее 1 активность:

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

Взгляните на LINQ, Вы можете заменить этим ваш код: ActivityList.Any(i => i.Id == GuidToCompare);

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

// Code here 

} 
0

Просто, чтобы предложить вам все способы, которыми вы можете написать этот запрос с помощьюне

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

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

Теперь это до вас, чтобы выбрать более читаемый фрагмент;)

1

Если вы ищете только один Ид один раз, не существует более эффективный способ.

Если вы ищете Ids несколько раз, вы можете построить HashSet:

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

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

Если вам необходимо найти экземпляр деятельности вы можете построить словарь (работает только если Id является уникальным):

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

Другое решение с использованием Linq с Where/FirstOrDefault/Any на Id не будет более эффективным, чем ваше.

1

найти все объекты деятельности с данным GUID вы можете использовать:

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

Для тех, кто не может использовать LINQ:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^