程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 字符串按首字母分組並ToDictionary的實現

字符串按首字母分組並ToDictionary的實現

編輯:C#入門知識

  這是攜程(深圳).net開發筆試的一道題目,要求實現字符串按首字母分組並ToDictionary輸出,當時沒有做出來,後面研究了一下,現在將這道題的幾種實現方式記錄下來。

首先初始化數據源,是一個List<string>對象。如下代碼。

//數據源
            List<string> list = new List<string> 
            {
                "Beijing", "Shanghai", "Tianjin", "Chongqing", "Harbin", "Dalian", "Qingdao", "Xi'an",   
                "Dunhuang", "Nanjing", "Wuxi", "Suzhou", "Yangzhou", "Zhenjiang", "Hangzhou", "Xitang",   
                "Zhoushan", "Chun'an", "Qiandaohuzhen", "Shaoxing", "Huangshan", "Jiujiang", "Xiamen",  
                "Wuyi Shan", "Zhangjiajie", "Chengdu", "Shenzhen", "Zhuhai", "Guangzhou", "Guilin",   
                "Kunming", "Xishuangbanna", "Dali", "Lijiang", "Guiyang", "Urumqi", "Turpan", "Lhasa"
            };

第一種分組方法,使用正則表達式,代碼如下。

        /// <summary>
        /// 使用正則表達式匹配
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string GetGroupNameByRegex(char str)
        {
            string sInput = str.ToString();
            if (Regex.IsMatch(sInput, "[a-gA-G]", RegexOptions.IgnoreCase))
            {
                return "A-G";
            }
            if (Regex.IsMatch(sInput, "[h-nH-N]", RegexOptions.IgnoreCase))
            {
                return "H-N";
            }
            return "O-Z";
        }

第二種方法,直接比較兩個char,代碼如下。

        /// <summary>
        /// 方法二:使用字符的ASCII碼大小匹配
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string GetGroupNameByCharASCII(char str)
        {
            if ((str >= 'a' && str <= 'g') || (str >= 'A' && str <= 'G')) //char可以隱式地轉換為int
            {
                return "A-G";
            }
            if ((str >= 'h' && str <= 'n') || (str >= 'H' && str <= 'N'))
            {
                return "H-N";
            }
            return "O-Z";
        }

注意,兩個char之所以能直接比較大小,實際上char先被轉換成了int,也就是對應的ASCII碼,然後才進行比較大小的。

第三種方法,實際上跟第二種方法相同,只不過在方法二的基礎上進行了優化,代碼如下。

        /// <summary>
        /// 方法二的升級版
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string GetGroupNameByCharASCII1(char str)
        {
            char newChar = Char.ToLower(str);
            //if (newChar >= 'o')
            //{
            //    return "O-Z";
            //}
            //if (newChar>='h')
            //{
            //    return "H-N";
            //}
            //return "A-G";
            return newChar >= 'o' ? "O-Z" : newChar >= 'h' ? "H-N" : "A-G";
        }

需要注意的是,方法三的寫法,多個if...else...語句可以使用三元操作符來化簡,使代碼更優雅。

輸出結果,代碼如下。

var query = list.GroupBy(p =>
{
    return GetGroupNameByRegex(p[0]);
}).ToDictionary(p => p.Key, p => p);
foreach (var item in query)
{
    Console.WriteLine("{0}", item.Key);//IGrouping<TKey,TValue>
    foreach (var subItem in item.Value)
    {
        Console.WriteLine("  {0}", subItem);
    }
}
Console.ReadKey();

輸出結果截圖如下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved