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.
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
}
Take a look to the LINQ, You can replace with it your code by: ActivityList.Any(i => i.Id == GuidToCompare);
foreach(var activity in ActivityList.Where(p=>p.Id == GuidToCompare))
{
// Code here
}
to find all activity objects with the given GUID you can use:
var results = ActivityList.FindAll(item => item.ID == GuidToCompare);
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.
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
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 ;)
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
}