List<T>.Contains() 方法是基于什么实现的呢???

解决方案 »

  1.   

    问这种问题应该批评,因为起码你不能懒到连msdn都不看下。http://msdn.microsoft.com/zh-cn/library/bhkz42b3(v=vs.110).aspx说的很清楚
    此方法执行线性搜索;因此,此方法的运算复杂度是 O(n),其中 n 为 Count。结论就是和foreach的效率一样。
      

  2.   

    所以Contains里其实封装的就是for循环
      

  3.   


    问题:
    List<T>.Contains()方法,如果泛型集合中存在T1对象, 现在又有一个T2对象。  T1和T2它们是同一个类实例化出来的,但是有一个字段不一样,现在
    Contains(T2)是  判断为存在还是不存在???
     

     
      

  4.   


    我喜欢CSDN啊,MSDN其实也有,但是看了之后不能确定。想问问大家的意见。
      

  5.   

    不知道  Any的效率 如何
      

  6.   

    List.Contains is a O(n) operation.
    Dictionary.ContainsKey is a O(1) operation
      

  7.   

    T1.Contains(T2)??
    当然是不存在
    除非T1里放入T2,T2作为T1数组的一个元素
      

  8.   

    无语。难道任何两个能装入List<T>的不同的对象(不算继承关系)不都是“同一个类实例化出来”。
    如果Contains连这个都区分不了,要这个方法有什么用。
      

  9.   

    我不是说lz一个人,这种常识问题真的那么多人都搞不清楚么。
    我是菜鸟,,  any方法也是 通过枚举 集合来确定元素是否存在,应该与Contains一样。
      

  10.   

    如果一个查找不是线性查找,要么它要有索引的逻辑,要么内部使用binarytree一类的方式存储,要么需要获取对象的hash,如果它没有表现出这些外在特征,毫无疑问(都不需要查文档),肯定是线性查找。
      

  11.   

    此方法的运算复杂度是 O(n),其中 n 为 Count。结论就是和foreach的效率一样。 
      

  12.   


    EqualityComparer<T> comparer = EqualityComparer<T>.Default;
        for (int i = 0; i < this._size; i++)
        {
            if (comparer.Equals(this._items[i], item))
            {
                return true;
            }
        }
        return false;也是一个一个的比较是否相同...
      

  13.   

    我不是说lz一个人,这种常识问题真的那么多人都搞不清楚么。
    我是菜鸟,,  any方法也是 通过枚举 集合来确定元素是否存在,应该与Contains一样。
    通常来说是这样的,除了Linq2Sql/Linq2EF,对于表达式树做any和foreach耗费资源的结果就大大的不一样了。
      

  14.   

    我不是说lz一个人,这种常识问题真的那么多人都搞不清楚么。
    我是菜鸟,,  any方法也是 通过枚举 集合来确定元素是否存在,应该与Contains一样。
    通常来说是这样的,除了Linq2Sql/Linq2EF,对于表达式树做any和foreach耗费资源的结果就大大的不一样了。为什么Linq 消耗的资源那么多???
      

  15.   

    我不是说lz一个人,这种常识问题真的那么多人都搞不清楚么。
    我是菜鸟,,  any方法也是 通过枚举 集合来确定元素是否存在,应该与Contains一样。
    通常来说是这样的,除了Linq2Sql/Linq2EF,对于表达式树做any和foreach耗费资源的结果就大大的不一样了。为什么Linq 消耗的资源那么多???
    不是linq本身的问题,而是linq2ef/linq2sql,获取数据都需要转换为sql语句,如果你用any就直接转换为select exist/select top 1之类的代码,由数据库处理;
    如果你用foreach,那么就需要select *把整个数据集取出来再在内存里做查找。
    这是用linq2ef/linq2sql时候需要注意的地方。
      

  16.   

    我不是说lz一个人,这种常识问题真的那么多人都搞不清楚么。
    我是菜鸟,,  any方法也是 通过枚举 集合来确定元素是否存在,应该与Contains一样。
    通常来说是这样的,除了Linq2Sql/Linq2EF,对于表达式树做any和foreach耗费资源的结果就大大的不一样了。为什么Linq 消耗的资源那么多???
    不是linq本身的问题,而是linq2ef/linq2sql,获取数据都需要转换为sql语句,如果你用any就直接转换为select exist/select top 1之类的代码,由数据库处理;
    如果你用foreach,那么就需要select *把整个数据集取出来再在内存里做查找。
    这是用linq2ef/linq2sql时候需要注意的地方。
    还是一码事啊,数据库还不得把所有的都拿出来遍历,当然做了索引神马的之后就是另外一回事了。
      

  17.   

    我不是说lz一个人,这种常识问题真的那么多人都搞不清楚么。
    我是菜鸟,,  any方法也是 通过枚举 集合来确定元素是否存在,应该与Contains一样。
    通常来说是这样的,除了Linq2Sql/Linq2EF,对于表达式树做any和foreach耗费资源的结果就大大的不一样了。为什么Linq 消耗的资源那么多???
    不是linq本身的问题,而是linq2ef/linq2sql,获取数据都需要转换为sql语句,如果你用any就直接转换为select exist/select top 1之类的代码,由数据库处理;
    如果你用foreach,那么就需要select *把整个数据集取出来再在内存里做查找。
    这是用linq2ef/linq2sql时候需要注意的地方。
    还是一码事啊,数据库还不得把所有的都拿出来遍历,当然做了索引神马的之后就是另外一回事了。
    怎么可能是一码事?select *所有数据到一个datatable里,c#里循环找存在不存在 和数据库里直接select exists,性能差多少?!
      

  18.   

    我不是说lz一个人,这种常识问题真的那么多人都搞不清楚么。
    我是菜鸟,,  any方法也是 通过枚举 集合来确定元素是否存在,应该与Contains一样。
    通常来说是这样的,除了Linq2Sql/Linq2EF,对于表达式树做any和foreach耗费资源的结果就大大的不一样了。为什么Linq 消耗的资源那么多???
    不是linq本身的问题,而是linq2ef/linq2sql,获取数据都需要转换为sql语句,如果你用any就直接转换为select exist/select top 1之类的代码,由数据库处理;
    如果你用foreach,那么就需要select *把整个数据集取出来再在内存里做查找。
    这是用linq2ef/linq2sql时候需要注意的地方。
    还是一码事啊,数据库还不得把所有的都拿出来遍历,当然做了索引神马的之后就是另外一回事了。
    怎么可能是一码事?select *所有数据到一个datatable里,c#里循环找存在不存在 和数据库里直接select exists,性能差多少?!第一看数据库配置。如果数据库被查询字段没有做索引,是一样的,需要从硬盘读取后遍历。当然,如果是常用数据,数据库会将数据驻留在内存中,就不需要再次读取硬盘。如果你的程序有缓存,那也差不多。
    当然在使用Linq2SQL的时候,还是推荐用any。如果对数据库不熟悉的话。
      

  19.   

    我不是说lz一个人,这种常识问题真的那么多人都搞不清楚么。
    我是菜鸟,,  any方法也是 通过枚举 集合来确定元素是否存在,应该与Contains一样。
    通常来说是这样的,除了Linq2Sql/Linq2EF,对于表达式树做any和foreach耗费资源的结果就大大的不一样了。为什么Linq 消耗的资源那么多???
    不是linq本身的问题,而是linq2ef/linq2sql,获取数据都需要转换为sql语句,如果你用any就直接转换为select exist/select top 1之类的代码,由数据库处理;
    如果你用foreach,那么就需要select *把整个数据集取出来再在内存里做查找。
    这是用linq2ef/linq2sql时候需要注意的地方。
    还是一码事啊,数据库还不得把所有的都拿出来遍历,当然做了索引神马的之后就是另外一回事了。
    怎么可能是一码事?select *所有数据到一个datatable里,c#里循环找存在不存在 和数据库里直接select exists,性能差多少?!第一看数据库配置。如果数据库被查询字段没有做索引,是一样的,需要从硬盘读取后遍历。当然,如果是常用数据,数据库会将数据驻留在内存中,就不需要再次读取硬盘。如果你的程序有缓存,那也差不多。
    当然在使用Linq2SQL的时候,还是推荐用any。如果对数据库不熟悉的话。一样不一样自己试试就好了,(from x in xxx select x).Any()和(from x in xxx select x).ToArray().Any()自己看看差多少。