C#根据地址信息,自动获取该地址对应的行政区域编码|C/S开发框架
作者:csframework|C/S框架网  发布日期:2022/01/06 12:19:06
  C#根据地址信息,自动获取该地址对应的行政区域编码|C/S开发框架

C#根据地址信息,自动获取该地址对应的行政区域编码|C/S开发框架

C#源码:GetCityId方法实现

C# 全选
        /// <summary>
        /// 根据地址信息,自动获取行政区域编码
        /// </summary>
        /// <param name="data">城市编码数据库,dt_city表</param>
        /// <param name="address">地址信息</param>
        /// <param name="cityIDs">输出3个城市编码,调号隔开</param>
        /// <param name="cityNames">输出3个城市名称,调号隔开</param>
        /// <returns></returns>
        public bool GetCityId(DataTable data, string address, ref string cityIDs, ref string cityNames)
        {
            const int MAX_CITYS = 4;

            //内置函数:获取区域上级编号
            string GetParent(string cityCode)
            {
                var rs = data.Select($"code='{cityCode}'");
                if (rs.Length > 0)
                    return rs[0]["parent_id"].ToString();
                else
                    return "";
            }

            //内置函数:获取省市名称
            string GetCityName(List<string> codeList)
            {
                StringBuilder sb = new StringBuilder();
                foreach (var s in codeList)
                {
                    var rs = data.Select($"code='{s}'");
                    if (rs.Length > 0)
                        sb.Append(rs[0]["name"].ToString() + ",");
                }
                return sb.ToString();
            }

            List<String> ids = new List<string>();

            //分解地址            
            var list = address.Split(new char[] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries).Distinct().ToArray();

            //有规则,有分隔符号,如:上海市/上海市/松江区 松卫北路6700弄沪松五金建材市场3幢1*****
            if (list.Length > 1)
            {
                DataRow[] rs;
                foreach (var item in list)
                {
                    rs = data.Select($"name='{item}'");
                    if (rs.Length > 0)
                    {
                        ids.Add(rs[0]["code"].ToString());
                        ids.Add(rs[0]["parent_id"].ToString());
                        ids.Add(GetParent(rs[0]["parent_id"].ToString()));
                    }
                }
            }
            else //没有分隔符,如:江苏省昆山市振石路xxx房间
            {
                //枚举城市名称,匹配地址
                foreach (DataRow R in data.Rows)
                {
                    if (address.IndexOf(R["name"].ToString()) >= 0)
                    {
                        ids.Add(R["code"].ToString());
                        ids.Add(R["parent_id"].ToString());
                        ids.Add(GetParent(R["parent_id"].ToString()));
                    }
                }
            }

            var result = ids.Distinct().OrderBy(x => x).ToList<String>();
            result.Remove("100000");//删除根节点
            result.Remove("");//删除空元素
            result = result.Take<String>(MAX_CITYS).ToList<String>();

            //返回结果
            cityIDs = result.Count == 0 ? "," : String.Join(",", result);
            cityNames = GetCityName(result);

            return result.Count > 0;

        }

测试案例

C# 全选
  static void Main(string[] args)
        {
            //获取城市数据
            var dt = new SyncHelper().GetCityData();

            string ids = "";
            string names = "";

            //测试案例
            var s1 = new SyncHelper().GetCityId(dt, "上海市/上海市/松江区 松卫北路6700弄沪松五金建材市场3幢1*****", ref ids, ref names);
            Console.WriteLine(ids + "   " + names);
            var s2 = new SyncHelper().GetCityId(dt, "蔡灵波    上海市/黄浦区/南京东路街道 湖滨路150号企业天地5号楼B*****", ref ids, ref names);
            Console.WriteLine(ids + "   " + names);
            var s3 = new SyncHelper().GetCityId(dt, "江苏省昆山市振石路与*****", ref ids, ref names);
            Console.WriteLine(ids + "   " + names);
            var s4 = new SyncHelper().GetCityId(dt, "上海住豪建筑 上海市/青浦区 青浦区徐泾镇龙联*****", ref ids, ref names);
            Console.WriteLine(ids + "   " + names);
            var s5 = new SyncHelper().GetCityId(dt, "绍兴市隐山府项目部(杨绍线与山阴*****", ref ids, ref names);
            Console.WriteLine(ids + "   " + names);
            var s6 = new SyncHelper().GetCityId(dt, "张家港市塘桥镇南环路阳地钢工地(58号银达*****", ref ids, ref names);
            Console.WriteLine(ids + "   " + names);
            Console.ReadKey();

        }

测试结果

C#根据地址信息,自动获取该地址对应的行政区域编码|C/S开发框架

C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇