在列表中的属性上使用. contains()

本文关键字:contains 列表 属性 | 更新日期: 2023-09-27 18:16:24

我有一个活动列表。在Activity类中是一个ID属性(为了参数的目的,是一个Guid)。我想检查这个列表是否有一个活动在它与我有一个向导。而不是这样:

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

是否有一个更有效的方法来实现相同的结果,我可以,如果我只是有一个Guids列表(而不是活动的列表),并使用。contains ()?

我有一个名为ActivityAndPO的结构体的列表。在这个结构体中是一个Guid。我有一份订单清单。在PO类中是一个Guid。

我想循环遍历ActivityAndPO列表中的所有对象,其中Guid存在于PO列表中。

在列表中的属性上使用. contains()

可以。

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
}

看一下LINQ,你可以用它替换你的代码:ActivityList.Any(i => i.Id == GuidToCompare);

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

查找具有给定GUID的所有活动对象,您可以使用:

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

如果您一次只查找一个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);

如果你需要找到一个实例的活动,你可以建立一个字典(只有当Id是唯一的):

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

其他解决方案使用Linq与Where/FirstOrDefault/Any在Id上不会比你的更有效。

我还没有测试过,但我很确定这应该可以工作:

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

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

为您提供使用Linq编写此查询的所有方法

var result = (from activity in activityList
              where activity.Id == GuidToCompare
              select activity ).FirstOrDefault();
if(result != null)
    /* Code here */

现在,由您来选择更具可读性的代码段;)

对于不会使用LINQ的用户:

List<Activity> ActivityList = new List<Activity>();
foreach (Activity activity in ActivityList.FindAll(delegate(Activity a)
    {
        return a.Id == GuidToCompare;
    }))
{
    //Code here
}