Using .Contains() on a property in a list

2019-01-19 03:16发布

问题:

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.

回答1:

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
}


回答2:

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



回答3:

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

// Code here

}


回答4:

to find all activity objects with the given GUID you can use:

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


回答5:

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.



回答6:

I Havent tested it but im fairly sure this should work:

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

MSDN Any : http://msdn.microsoft.com/en-us/library/bb534972.aspx



回答7:

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 ;)



回答8:

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
}