项目工作中常见问题系列! 持续更新!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目工作中常见问题系列! 持续更新!相关的知识,希望对你有一定的参考价值。
-
欧洲日期转标准或中文日期
欧洲大多数国家日期格式 24-12-1991 代表 dd-mm-yyyy 现在我想转换成中文日期格式1991年12月24日
或者转成国际标准格式日期 1991-12-24 yyyy-mm-dd格式 怎么解决呢?
这里我们可以通过正则表达式 轻松解决这个问题
static void Main(string[] args) { //定义一组欧洲日期列表 数据来源可能是一张数据表 或txt文本文件等.. var enDateList = new List<string> { "01-01-2016", "20-02-2017", "10-03-2014", "28-02-2015", "11-06-2013", "01-05-2015", "12-10-2010", "24-01-2011" }; var cnDateList = new List<string>(); enDateList.ForEach(d => { //通过正则表达式进行转换 var cnDate = System.Text.RegularExpressions.Regex.Replace(d, @"(\\d{2})-(\\d{2})-(\\d{4})", "$3年-$2月-$1日"); cnDateList.Add(cnDate);//转换的日期重新填充一个新的 日期列表 }); cnDateList.ForEach(Console.WriteLine);//打印转换后的结果 Console.ReadKey(); }
通过这个例子我们可以举一反三 转换成 标准日期格式 yyyy-mm-dd 或者转换美国的日期格式 mm-dd-yyyy
这个解决方法非常简单, 如果你了解正则的情况下,可以看到其实就是通过正则 先分组然后替换分组实现的,
题外话:小弟在工作中感觉学会正则,会帮自己轻松愉快的解决很多问题, 所以如果你还不会正则表达式 那么你应该
开始学习!
-
获取用户请求所在Ip地址和用户的城市信息
这个需求问题在Web项目中基本都是必备功能!所以这里贴出源码,并解释下代码中的思想
/// <summary> /// 获取客户端IP /// </summary> /// <param name="req"></param> /// <returns></returns> public static string GetIp(RequestContext req) { try { //先用用 Request.ServerVariables ("HTTP_X_FORWARDED_FOR") 取IP 如果无法读取会返回Null string result = req.HttpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (string.IsNullOrEmpty(result)) { //再用正常来取得客户端的IP地址 result = req.HttpContext.Request.ServerVariables["REMOTE_ADDR"]; } if (string.IsNullOrEmpty(result)) { //如果未读取再用其它方式读取尝试 result = req.HttpContext.Request.UserHostAddress; } if (string.IsNullOrEmpty(result)) { //没有读取返回默认地址 result = "0.0.0.0"; } return result; } catch { return "0.0.0.0"; } }
上面读取Ip地址代码的巧妙在于Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,
那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址。要想透过代理服务器取得客户端的真实IP地址,就要使用 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 来读取。
如果客户端没有通过代理服务器来访问,那么用 Request.ServerVariables ("HTTP_X_FORWARDED_FOR") 取到的值将是空的,所以我把它放在第一句执行,这样可以保证尽可能读取客户端的Ip地址
接下来我们就可以通过Ip去获取用户所在城市的信息了(代码如下)
/// <summary> /// 获取城市Ip /// </summary> /// <param name="ip"></param> /// <returns></returns> public static string GetIpCity(string ip) { try { //通过淘宝API方式获取用户地址信息 string taoBaoApi = $"{"http://ip.taobao.com/service/getIpInfo.php?ip="}{ip}"; System.Net.WebRequest httpReq = System.Net.WebRequest.Create(taoBaoApi); httpReq.Timeout = 2000; //设置请求超时2秒 System.Net.WebResponse httpResp = httpReq.GetResponse(); System.IO.Stream respStream = httpResp.GetResponseStream(); using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream)) { string jsonText = reader.ReadToEnd(); JObject addr = (JObject)JsonConvert.DeserializeObject(jsonText); if (addr["code"].ToString() != "0")//如果状态Code不等0 就代表请求失败 { return "未知地址"; } else { //获取结果 string address = $"{addr["data"]["region"]}{addr["data"]["city"]}"; return address; } } } catch { return "未知地址"; } }
-
如果让方法返回多个结果?
在工作编写代码中可能会遇到写一个方法 我想返回多个结果集的问题,这种解决办法 有几种,小弟在这里列出我最常用的2种.
方式1:通过out参数 进行多个结果参数返回, out参数在我们入门第二 三章就可能学过! 它的目的是可以把值类型当引用类型来传递!
这里我们可以借助它的特点来进行多个结果集返回!
例子1: 假如我们要写个分页的方法 GetPageData(),分页它不仅要获取分页查询后的结果集 还要获取分页这张表的总项数
基于这个需求我们可以只写一个方法 就能同时获取2个结果
/// <summary> /// 数据表 分页 /// </summary> /// <param name="pageNum">指定页数</param> /// <param name="pageSize">指定每页多少项</param> ///<param name="outTotal">输出当前表的总项数</param> /// <returns>分页后的结果集数据</returns> public IEnumerable<TEntity> GetPageData(int pageNum, int pageSize, out long outTotal)
调用方式
long tableCount;//拿到表的总项数 var data= _repExample.GetPageData(1, 20, out tableCount);//拿到分页后的数据集
方式2: 可以同过定义一个类来接受多个结果集,比如基于上面的GetPage分页的方法 我可以单独定义一个 PageResult的类 来返回我的数据 (以下为伪代码 演示用)
Public Class PageResult { /// <summary> /// 获取或设置数据查询总记录数 /// </summary> public long total { get; set; } /// <summary> /// 获取查询总页数 /// </summary> public long TotalPage { get { if (total % PageSize != 0) { return total / PageSize + 1; } else { return total / PageSize; } } } /// <summary> /// 获取或设置查询数据 /// </summary> public IEnumerable<TEntity> rows { get; set; } }
这样我们可以用我们定义的这个类来接受返回的多个参数
未完(持续更新 自我总结)
以上是关于项目工作中常见问题系列! 持续更新!的主要内容,如果未能解决你的问题,请参考以下文章
一点就分享系列(实践篇5-上篇)[持续更新中!代码已吸收!依旧全网首发] yolov7解析:yolov5的plus扩充 ,仍旧值得学习!一起看V5代码如何变成V7!