别再手动写56个民族了!这个 .NET NuGet 包直接拿去用

别再手动写56个民族了!这个 .NET NuGet 包直接拿去用 做后台系统、人员档案、户籍录入这类项目的时候几乎都会碰到一个需求民族下拉框。56 个民族名字要标准、编码要规范、还要支持搜索。以前我偷懒要么直接写死一个枚举要么从网上随便复制一份数据贴到代码里。结果过两个月需求变了要加拼音检索、要按国标编码排序、数据库存的是“01”但前端要显示“汉族”……然后就开始漫长的 if-else 和硬编码。后来实在不想重复造轮子了就整理了一个小组件把民族数据、枚举转换、模糊搜索这些事一次性封装好于是就有了下面这个包。NuGet截图组件长什么样其实就是一套静态方法引入就能用不需要建表也不需要手动初始化。VS搜索出来的样子dotnet add package XiuXian.China.Nations命名空间就一个using XiuXian.China.Nations.Services;最常用的几个操作我先把日常写代码时最常用的场景列一下基本覆盖 80% 的需求。1. 拿全部民族列表绑定下拉框的时候用var nations NationLibrary.GetAll(); // 直接丢给 SelectList 或者前端2. 编码和民族互转数据库存的01汉族要显示汉字var nation NationLibrary.GetByCode(01); string name nation?.Name; // 汉族反过来前端选了“回族”后端要存编码string code NationLibrary.GetCodeByEnum(NationEnum.Hui);3. 模糊搜索用户输入“蒙”、“meng”、“MG”都能搜到蒙古族相关的民族var result NationLibrary.Search(蒙);这个功能在带搜索的下拉框里非常实用不用自己写Contains或者IndexOf了。4. 判断是不是少数民族有时候统计口径需要区分汉族和少数民族if(!nation.IsHan()) { // 少数民族单独处理 }这个数据模型是怎么设计的内部用的NationInfo长这样不复杂但够用public class NationInfo { public string Code { get; set; } // 01-56其他民族99 public string Name { get; set; } // 汉族、回族... public string Pinyin { get; set; } // Han, Hui... public string ShortCode { get; set; } // HZ, HUI 这种简写 public NationEnum EnumValue { get; set; } }json示意图这里有一个坑要提醒一下简码ShortCode是有重复的。比如不同民族可能共用同一个简码所以按简码查会返回多条记录业务上要自己处理。两个排序规则这个细节很多人会忽略。民族列表有时候要按国标编码01 汉族、02 蒙古族…有时候要按拼音首字母白族、藏族、傣族…。组件里直接给了两种// 按拼音排序适合前端展示 var list NationLibrary.OrderByPinyin();拼音排序Json示意图我的建议是政府项目用编码排序互联网项目用拼音排序。别问为什么踩过坑的都知道。一些不太起眼但很舒服的小设计编码自动兼容1和01都能查到汉族不用自己补零。查不到不抛异常返回null或空集合不用包一层try-catch。线程安全 懒加载不用手动 new静态调用就行。这个库适合哪些项目后台管理系统的数据字典人口、户籍、档案类业务需要下拉框 搜索的民族选择组件多个项目之间需要统一民族数据的场景一点个人看法说实话这个组件技术含量不高就是把国家标准数据整理成代码再加几个常用的查询方法。但它减少的是重复劳动的烦躁感。每次新项目都要重新写一遍民族枚举、做拼音转换、处理编码对齐真的很无聊。如果你现在项目里民族数据还是硬编码或写在配置文件里可以试试这个方式。至少下一个人接手代码的时候不用再问“这个民族编码从哪来的”这种问题。文档地址https://www.nuget.org/packages/XiuXian.China.Nations/1.0.0#readme-body-tabhttps://www.nuget.org/packages/XiuXian.China.Nations/1.0.0#readme-body-tabNuGet 版本v1.0.0netstandard2.0;netstandard2.1;net6.0;net8.0;net9.0;net10.0;支持平台示意图如果有什么奇怪的需求比如民族合并、自定义排序可以自己继承扩展。