我有一份活动清单。在Activity类中是一个ID属性(参数的Guid)。我想检查一下这个列表中是否有一个带有Guid的Activity。而不是这个:
foreach(Activity activity in ActivityList)
{
if(activity.Id == GuidToCompare)
//Code here
}
如果我只有一个Guids列表(而不是Activity列表)并使用.Contains(),是否有更有效的方法来获得相同的结果?
我有一个名为ActivityAndPO的结构列表。在这个结构中是一个Guid。 我有一份PO列表。在PO类中是Guid。
我想遍历ActivityAndPO列表中所有对象,其中Guid存在于PO列表中。
答案 0 :(得分:8)
不确定
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
}
答案 1 :(得分:6)
查看LINQ,您可以用以下代码替换您的代码:ActivityList.Any(i => i.Id == GuidToCompare);
答案 2 :(得分:1)
foreach(var activity in ActivityList.Where(p=>p.Id == GuidToCompare))
{
// Code here
}
答案 3 :(得分:1)
如果您一次只找到一个Id,则没有更有效的方式。
如果您多次寻找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与Id上的Where / FirstOrDefault / Any将不会比您的效率更高。
答案 4 :(得分:1)
查找具有您可以使用的给定GUID的所有活动对象:
var results = ActivityList.FindAll(item => item.ID == GuidToCompare);
答案 5 :(得分:0)
我没有对它进行过测试,但我相当确定这应该有效:
if ( ActivityList.Any ( a => a.Id == GuidToCompare ) ) {
// TODO - Exists.
}
MSDN Any:http://msdn.microsoft.com/en-us/library/bb534972.aspx
答案 6 :(得分:0)
只是为您提供使用Linq
var result = (from activity in activityList
where activity.Id == GuidToCompare
select activity ).FirstOrDefault();
if(result != null)
/* Code here */
现在,您可以选择更具可读性的代码段;)
答案 7 :(得分:0)
对于那些不能使用LINQ的人:
List<Activity> ActivityList = new List<Activity>();
foreach (Activity activity in ActivityList.FindAll(delegate(Activity a)
{
return a.Id == GuidToCompare;
}))
{
//Code here
}