Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 286|回复: 0

[默认分类] C# Dictionary 的几种遍历方法

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-6-13 10:53:27 | 显示全部楼层 |阅读模式
    网上看到的,记录下来,供参考,备忘
    Dictionary<string, int> list = new Dictionary<string, int>();
      
                list.Add("d", 1);
      
                //3.0以上版本
                foreach (var item in list)
                {
                    Console.WriteLine(item.Key + item.Value);
                }
                //KeyValuePair<T,K>
                foreach (KeyValuePair<string, int> kv in list)
                {
                    Console.WriteLine(kv.Key + kv.Value);
                }
                //通过键的集合取
                foreach (string key in list.Keys)
                {
                    Console.WriteLine(key + list[key]);
                }
                //直接取值
                foreach (int val in list.Values)
                {
                    Console.WriteLine(val);
                }  
                //非要采用for的方法也可
                List<string> test = new List<string>(list.Keys);
      
                for (int i = 0; i < list.Count; i++)
                {
                    Console.WriteLine(test + list[test]);
                }
    Dictionary( TKey , TValue )
      
    表示键和值的集合。
      
    Dictionary( TKey, TValue) 泛型类提供了从一组键到一组值的映射。字典中的每个添加项都由一个值及其相关联的键组成。通过键来检索值的速度是非常快的,接近于 O(1),这是因为 Dictionary( TKey, TValue) 类是作为一个哈希表来实现的。(检索速度取决于为 TKey 指定的类型的哈希算法的质量。)
      
      
    只要对象用作 Dictionary( TKey, TValue) 中的键,它就不能以任何影响其哈希值的方式更改。使用字典的相等比较器比较时,Dictionary( TKey, TValue) 中的任何键都必须是唯一的。键不能为 null 。 但是如果值类型 TValue 为引用类型,该值则可以为空。
      
    Dictionary( TKey, TValue) 需要一个相等实现来确定键是否相等。可以使用一个接受 comparer 参数的构造函数来指定 IEqualityComparer( T) ) 泛型接口的实现;如果不指定实现,则使用默认的泛型相等比较器 EqualityComparer( T) ) . Default 。如果类型 TKey 实现 System. IEquatable< (Of < ( T> ) > ) 泛型接口,则默认相等比较器会使用该实现。
      
      
      
    Dictionary( TKey, TValue) 的容量是 Dictionary( TKey, TValue) 可以包含的元素数。当向 Dictionary( TKey, TValue) 中添加元素时,将通过重新分配内部数组来根据需要自动增大容量。
      
    对于枚举而言,字典中的每一项都被视为一个表示值及其键的 KeyValuePair( TKey, TValue) 结构进行处理。项返回的顺序未定义。
      
    C# 语言的 foreach 语句(在 C++ 中为 for each ,在 Visual Basic 中为 For Each )需要集合中每个元素的类型。由于 Dictionary( TKey, TValue) 是键和值的集合,因此元素类型并非键类型或值类型。相反,元素类型是键类型和值类型的 KeyValuePair( TKey, TValue) 。例如:
      
    此类型的公共静态(在 Visual Basic 中为 Shared )成员是线程安全的。但不能保证任何实例成员是线程安全的。
      
    只要不修改该集合,Dictionary( TKey, TValue) 就可以同时支持多个阅读器。即便如此,从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。当出现枚举与写访问互相争用这种极少发生的情况时,必须在整个枚举过程中锁定集合。若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。

    ///summary ///通过DictionaryK,V传递参数 ////summary ///paramname=sql/param ///paramname=parms/param ///returns/returns public static SqlDataReaderExecuteReader( string sql,Dictionary string , string parms) { SqlDataReadersqlReader= null ;


      


      
      /// <summary>  
              /// 通过Dictionary<K,V>传递参数  
              /// </summary>  
              /// <param name="sql"></param>  
              /// <param name="parms"></param>  
              /// <returns></returns>  
              public static SqlDataReader ExecuteReader(string sql, Dictionary<string, string> parms)  
              {  
                  SqlDataReader sqlReader = null;  
                  SqlConnection sqlConn = new SqlConnection(conStr);  
                  SqlCommand sqlCmd = new SqlCommand(sql, sqlConn);  
                  foreach (string key in parms.Keys)  
                  {  
                      sqlCmd.Parameters.Add("@" + key, parms[key]);  
                  }  
                  sqlConn.Open();  
                  sqlReader = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection);  
                  return sqlReader;  
              }  
       
         
       
      调用如下:  
       
      =============  
       
       public UserRole GetRoleByID(int roleId)  
              {  
                  string sql = string.Format("select id roleid,rolename from userrole where id=@ID",roleId);  
                  Dictionary<string,string> sqlParams = new Dictionary<string,string>();  
                  sqlParams.Add("ID",roleId.ToString());  
       
                  UserRole ur=null;  
                  using (SqlDataReader sqlReader = DBHelper.ExecuteReader(sql,sqlParams))  
                  {  
                      while (sqlReader.Read())  
                      {  
                          ur = new UserRole((int)sqlReader["roleid"], sqlReader["rolename"].ToString());  
                      }  
                      sqlReader.Close();  
                  }  
                  return ur;  
              }  
      
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-24 10:21 , Processed in 0.301618 second(s), 35 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表