Using .Contains() on a property in a list

2019-01-19 03:05发布

I have a List of Activity. In the Activity class is an ID property (a Guid for arguments sake). I want to check if this list has an Activity in it with a Guid I have. Rather than this:

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

Is there a more efficient way to achieve the same result as I could if I were to have just a list of Guids (instead of a list of Activity's) and to use .Contains()?

I've got a list of a struct called ActivityAndPO. In this struct is a Guid. I have a list of PO's. In the PO class is a Guid.

I want to loop through all of objects in the the ActivityAndPO list where the Guid's exist in the list of PO's.

8条回答
Anthone
2楼-- · 2019-01-19 03:34

For those who can't use LINQ:

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

foreach (Activity activity in ActivityList.FindAll(delegate(Activity a)
    {
        return a.Id == GuidToCompare;
    }))
{
    //Code here
}
查看更多
Luminary・发光体
3楼-- · 2019-01-19 03:38

Sure.

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

But since Id implies there will be at most 1 activity:

//var act = ActivityList.Where(a => a.Id == GuidToCompare).SingleOrDefault(); // clearer
var act = ActivityList.SingleOrDefault(a => a.Id == GuidToCompare);          // shorter
if (act != null)
{
    //Code here
}
查看更多
可以哭但决不认输i
4楼-- · 2019-01-19 03:51

If you are looking for only one Id one time, there is no more efficient way.

If you are looking for Ids multiple times you can build a HashSet :

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

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

If you need to find an instance of activity you can build a Dictionary (works only if Id is unique) :

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

Others solution using Linq with Where/FirstOrDefault/Any on the Id won't be more efficient than yours.

查看更多
甜甜的少女心
5楼-- · 2019-01-19 03:52

Just to offer you all the ways you can write this query with Linq

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

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

Now, it is up to you to choose the more readable snippet ;)

查看更多
beautiful°
6楼-- · 2019-01-19 03:55

Take a look to the LINQ, You can replace with it your code by: ActivityList.Any(i => i.Id == GuidToCompare);

查看更多
劳资没心,怎么记你
7楼-- · 2019-01-19 03:55
foreach(var activity in ActivityList.Where(p=>p.Id == GuidToCompare))
{

// Code here

}
查看更多
登录 后发表回答