C#集合之Hashtable

   Hashtable是一个键值对集合,其泛型版本是Dictionary<K, V>,下面说下常用的一些方法;

1.Add(),向Hashtable添加元素,需要注意的是因为它是键值对集合,所以要同时添加一个键和一个值,且键不能重复。

2.ContainsKey(key)方法,是查询是否包含某个键,其Contains()方法最终也是调用这个方法实现的。

3.ContainsValue(value)方法,是查询是否包含某个值。

4.hash[“key”],根据键获取某个值。hash[“key”]=“修改”,根据键修改对应的值。

5.Remove(“key”);根据键删除对应的值。

需要注意的是,以上3个方法,其泛型版本Dictionary<K, V>也是一样的。

Keys属性,是Hashtable的键集合。Values属性,是Hashtable的值集合;可以通过foreach遍历它的键集合和值集合。

如果要同时得到Hashtable中的键集合和值集合,在使用foreach遍历时,请将var关键字替换为DictionaryEntry,这样就能同时拿到键和值了。

而对于Dictionary<K, V>要同时得到键集合和值集合,在使用foreach遍历时,请将var关键字替换为KeyValuePair<k,v>。

键值对集合,如果得到键,可以使用 集合名[键名]这样的索引方式获取对应的值。因为键值对集合不提供下标来访问,故这类集合不能通过for循环来遍历。

下面看几个例子程序,以便更好理解其实际应用:

1.将int数组中的奇数放到一个新的int数组中返回

int[] iArray = new int[] { 2, 7, 8, 3, 22, 9, 5, 11, 14, 18, 21 };

            ArrayList aLst = new ArrayList();

            for (int i = 0; i < iArray.Length; i++)

            {

                if (iArray[i] % 2 != 0)

                {

                    aLst.Add(iArray[i]);

                }

            }

            object[] obj = aLst.ToArray();

            foreach (var item in obj)

            {

                Console.WriteLine(item);

            }

            Console.ReadKey();

 2.从一个整数的List<int>中取出最大数(找最大值)(最简单是调用List集合的max方法)

 1 private static int GetMax(List<int> iList)

 2         {

 3             int iMax = iList[0];

 4             for (int i = 0; i < iList.Count; i++)

 5             {

 6                 if (iList[i]>iMax)

 7                 {

 8                     iMax = iList[i];

 9                 }

10             }

11             return iMax;

12         }

3.把123转换为:壹贰叁。

 1 /// <summary>

 2         /// 数字转换成大写汉字

 3         /// </summary>

 4         /// <param name="msg"></param>

 5         /// <returns></returns>

 6         private static string ConvertInt(string msg)

 7         {

 8             string s = "0零 1壹 2贰 3叁 4肆 5伍 6陆 7柒 8扒 9玖";

 9             Dictionary<char, char> dic = new Dictionary<char, char>();

10 

11             string[] strArray = s.Split(' ');

12             for (int i = 0; i < strArray.Length; i++)

13             {

14                 dic.Add(strArray[i][0], strArray[i][1]);

15             }

16 

17             StringBuilder sb = new StringBuilder();

18 

19             for (int i = 0; i < msg.Length; i++)

20             {

21                 if (dic.ContainsKey(msg[i]))

22                 {

23                     sb.Append(dic[msg[i]]);

24                 }

25                 else

26                 {

27                     sb.Append(msg[i]);

28                 }

29             }

30             return sb.ToString();

31         }

4.计算字符串中每种字母出现的次数(面试题)。 “Welcome ,to Chinaworld”

 1             Dictionary<char, int> dic = new Dictionary<char, int>();

 2 

 3             for (int i = 0; i < msg.Length; i++)

 4             {

 5                 if (!dic.ContainsKey(msg[i]))

 6                 {

 7                     dic.Add(msg[i], 1);

 8                 }

 9                 else

10                 {

11                     dic[msg[i]] = dic[msg[i]] + 1;

12                 }

13             }

14 

15             foreach (KeyValuePair<char, int> item in dic)

16             {

17                 Console.WriteLine("字符<{0}>在文本中出现了{1}次", item.Key, item.Value);

18             }

延伸,如果是要统计一段中文中,某个词组呢?

 1 string msg = "患者:“大夫,我咳嗽得很重。”     大夫:“你多大年记?”     患者:“七十五岁。”     大夫:“二十岁咳嗽吗”患者:“不咳嗽。”     大夫:“四十岁时咳嗽吗?”     患者:“也不咳嗽。”     大夫:“那现在不咳嗽,还要等到什么时咳嗽?”";

 2             string key = "咳嗽";

 3             int iIndex = msg.IndexOf(key, 0);

 4             if (iIndex!=-1)

 5             {

 6                 Console.WriteLine("字符{0}第1次出现的位置是:{1}", key, iIndex);

 7             }

 8             

 9             int iCount = 1;

10             while (iIndex != -1)

11             {

12                 iIndex = msg.IndexOf(key, iIndex + key.Length);

13                 if (iIndex != -1)

14                 {

15                     iCount++;

16                     Console.WriteLine("字符{0}第{1}次出现的位置是:{2}", key, iCount, iIndex);

17                 }

18                 else

19                 {

20                     break;

21                 }

22             }

5.编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,比如:二零一二年十二月月二十一日要转换为2012-12-21

 1 private static string ConvertDate(string strDate)

 2         {

 3             Dictionary<char, char> dic = new Dictionary<char, char>();

 4             string s = "零0 一1 二2 三3 四4 五5 六6 七7 八8 九9";

 5             string[] strArray = s.Split(' ');

 6             for (int i = 0; i < strArray.Length; i++)

 7             {

 8                 dic.Add(strArray[i][0], strArray[i][1]);

 9             }

10 

11             StringBuilder sb = new StringBuilder();

12             for (int j = 0; j < strDate.Length; j++)

13             {

14                 if (dic.ContainsKey(strDate[j]))

15                 {

16                     sb.Append(dic[strDate[j]]);

17                 }

18                 else

19                 {

20                     if (strDate[j]=='')

21                     {

22                         //1.十  10    10

23                         //2.二十 20   0

24                         //3.十二 12   1

25                         //4.二十二 22   不翻译

26 

27                         if (!dic.ContainsKey(strDate[j - 1]) && !dic.ContainsKey(strDate[j + 1]))

28                         {

29                             sb.Append("10");

30                         }

31                         else if (dic.ContainsKey(strDate[j - 1]) && !dic.ContainsKey(strDate[j + 1]))

32                         {

33                             sb.Append("0");

34                         }

35                         else if (!dic.ContainsKey(strDate[j - 1]) && dic.ContainsKey(strDate[j + 1]))

36                         {

37                             sb.Append("1");

38                         }

39                         else if (dic.ContainsKey(strDate[j - 1]) && dic.ContainsKey(strDate[j + 1]))

40                         {

41 

42                         }

43                     }

44                     else

45                     {

46                         sb.Append(strDate[j]);

47                     }

48                 }

49             }

50             string n = sb.ToString().Replace('','-');

51             n = n.Replace('', '-');

52             return n.Replace('',' ');

53         }

上面代码中的中文注释还对不同情况做了判断。

关于集合,先就说这么多,写出来算是给自己的总结,留作他日复习用。如果各路大神有补充,请跟我联系,共同进步啊!

你可能感兴趣的:(Hashtable)