这是一道面试题目,要求实现字符串按首字母分组并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();
输出结果截图如下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架