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

时间:2011-12-01 10:43:44

标签: c# .net list contains

我有一份活动清单。在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列表中。

8 个答案:

答案 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
}