Использование .Contains () для свойства в списке - PullRequest
6 голосов
/ 01 декабря 2011

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

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

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

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

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

Ответы [ 8 ]

8 голосов
/ 01 декабря 2011

Конечно.

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
}
6 голосов
/ 01 декабря 2011

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

1 голос
/ 01 декабря 2011

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

var results = ActivityList.FindAll(item => item.ID == GuidToCompare);
1 голос
/ 01 декабря 2011

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

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

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

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

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

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

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

1 голос
/ 01 декабря 2011
foreach(var activity in ActivityList.Where(p=>p.Id == GuidToCompare))
{

// Code here

}
0 голосов
/ 01 декабря 2011

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

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

foreach (Activity activity in ActivityList.FindAll(delegate(Activity a)
    {
        return a.Id == GuidToCompare;
    }))
{
    //Code here
}
0 голосов
/ 01 декабря 2011

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

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

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

Теперь вам нужно выбрать более читаемый фрагмент;)

0 голосов
/ 01 декабря 2011

Я не проверял это, но я уверен, что это должно работать:

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

MSDN Любой: http://msdn.microsoft.com/en-us/library/bb534972.aspx

...