none
使用List(T).Find和Foreach一点问题比较 RRS feed

  • 问题

  • 这两个方法是否相等,对List<T>.Find还是在使用上有点疑惑。
     private bool HasFtpServiceInstalled()
        {
    
          var list = new List<ServiceController>(ServiceController.GetServices());
          return list.Find((svr)=>svr.ServiceName == "MSFtpsvc") != null;
        }
    
    
     private bool HasFtpServiceInstalled()
        {
          bool flag = false;
          var list = new List<ServiceController>(ServiceController.GetServices());
          foreach (ServiceController svr in list)
          {
            if (svr != null)
              if ((svr.ServiceName == "MSFtpsvc"))
                flag = true;
          }
          return flag;
        }
    
    

    啥叫乐观-得瑟的最高境界
    2010年9月6日 9:14

答案

  • 这里是 List<T>.Find(Predicate<T> predicate) 的源代码。

    public T Find(Predicate<T> match)
    {
      if (match == null)
      {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
      }
      for (int i = 0; i < this._size; i++)
      {
        if (match(this._items[i]))
        {
          return this._items[i];
        }
      }
      return default(T);
    }
    
    
    

    所以看起来两者的性能没有明显区别。


    Mark Zhou
    • 已标记为答案 极度 2010年9月6日 9:51
    2010年9月6日 9:40
  • 不过您的第二种写法可以提速。foreach 中间的代码改成

    if (svr.ServiceName == "msftpsvc")
    {
        flag = true;
        break;
    }


    Mark Zhou
    • 已标记为答案 极度 2010年9月6日 9:51
    2010年9月6日 9:42

全部回复

  • 这里是 List<T>.Find(Predicate<T> predicate) 的源代码。

    public T Find(Predicate<T> match)
    {
      if (match == null)
      {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
      }
      for (int i = 0; i < this._size; i++)
      {
        if (match(this._items[i]))
        {
          return this._items[i];
        }
      }
      return default(T);
    }
    
    
    

    所以看起来两者的性能没有明显区别。


    Mark Zhou
    • 已标记为答案 极度 2010年9月6日 9:51
    2010年9月6日 9:40
  • 不过您的第二种写法可以提速。foreach 中间的代码改成

    if (svr.ServiceName == "msftpsvc")
    {
        flag = true;
        break;
    }


    Mark Zhou
    • 已标记为答案 极度 2010年9月6日 9:51
    2010年9月6日 9:42