【问题标题】:Using .Contains() on a property in a list对列表中的属性使用 .Contains()
【发布时间】:2012-01-10 12:28:20
【问题描述】:

我有一个活动列表。在 Activity 类中有一个 ID 属性(一个用于参数的 Guid)。我想检查这个列表中是否有一个带有我拥有的 Guid 的活动。而不是这个:

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

如果我只有一个 Guid 列表(而不是 Activity 列表)并使用 .Contains(),是否有更有效的方法来实现相同的结果?

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

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

【问题讨论】:

    标签: c# .net list contains


    【解决方案1】:

    当然。

    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
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        对于那些不能使用 LINQ 的人:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

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

            现在,由你来选择更具可读性的 sn-p ;)

            【讨论】:

              【解决方案6】:

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

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

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

              【讨论】:

                【解决方案7】:
                foreach(var activity in ActivityList.Where(p=>p.Id == GuidToCompare))
                {
                
                // Code here
                
                }
                

                【讨论】:

                  【解决方案8】:

                  查看 LINQ,您可以将代码替换为:ActivityList.Any(i =&gt; i.Id == GuidToCompare);

                  【讨论】:

                    猜你喜欢
                    • 2020-05-10
                    • 2017-06-08
                    • 2015-07-29
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-02-27
                    • 2020-12-12
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多