日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

撸码是需要直觉的

發(fā)布時(shí)間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 撸码是需要直觉的 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

隨著擼碼的時(shí)間增加,碼感也會(huì)加強(qiáng),今天看一個(gè)編碼直覺(jué)案例吧!

案例:

需求:把查詢到的數(shù)據(jù)列表生成csv文件

nuget包:CsvHelper

數(shù)據(jù)實(shí)體類:

/// <summary>/// 商品/// </summary>public class Goods{/// <summary>/// 編號(hào)/// </summary>public uint ID{ get; set; }/// <summary>/// 名稱/// </summary>public string Name{ get; set; }/// <summary>/// 規(guī)格/// </summary>public string Spec{ get; set; }/// <summary>/// 單位/// </summary>public string Unit{ get; set; }/// <summary>/// 制造商/// </summary>public string Manufacturer{ get; set; }/// <summary>/// 價(jià)格/// </summary>public decimal Price{ get; set; }/// <summary>///?這里是為了打印數(shù)據(jù)方例重寫ToString()/// </summary>public override string ToString(){return $"ID={ID},Name={Name},Unit={Unit},Spec={Spec},Price={Price},Manufacturer={Manufacturer}";}}

定義了一個(gè)csv操作的接口:

public interface ICsvHandle {List<Goods> ReadCsv(string file);void?WriteCsv(string?file,?List<Goods>?goodses); }

為了演示方便,Demo中的數(shù)據(jù)列表是通過(guò)Bogus產(chǎn)生(bogus在之前的文章中介紹過(guò))

static List<Goods> GoodsCreater(){var goodses = new List<Goods>();var options = new JsonSerializerOptions();options.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(UnicodeRanges.All);for (var i = 0; i < 100; i++){var goodsFaker = new Faker<Goods>("zh_CN").RuleFor(x => x.ID, x => x.Random.UInt()).RuleFor(x => x.Name, x => x.Random.ArrayElement(new string[]{"甲銷唑注射液", "葡萄糖注射液", "鹽水(氯化鈉)", "利巴韋林病毒唑針", "氟康唑氯化鈉注射液(康銳)", "安痛定針", "維生素B12針", "硫酸阿米卡星注射液", "氯化鈉注射液(塑料瓶)", "轉(zhuǎn)移因子注射液", "血塞通粉針", "苦碟子注射液", "注射用培美曲塞二鈉(愛(ài)立汀)", "左克注射液", "維生素C注射液", "硫酸慶大霉素注射液", "鹽酸左氧氟沙星注射液", "蔗糖鐵注射液", "注射用青霉素鈉", "維生素B1針", "疏血通注射液", "胃復(fù)安鹽酸甲氧氯普胺注射液", "硫酸慶大霉素注射液", "葡萄糖注射液50%", "銀杏達(dá)莫注射液", "硫酸慶大霉素注射液", "5%葡萄糖注射液", "注射用氨曲南",})).RuleFor(x => x.Price, x => x.Random.Decimal()).RuleFor(x => x.Unit, x => x.Random.ArrayElement(new string[] { "個(gè)", "片", "瓶", "盒", "支", "克" })).RuleFor(x => x.Spec, x => x.Random.ArrayElement(new string[]{"5*20ml", "250ml", "1ml*10支", "100ml:0.2g", "2毫升*10支", "10支", "2ml*10.2克*10支", "100ml", "3毫升:2毫升*10支", "20毫克", "10mg*10支", "0.5克", "2ml:0.1g", "0.25G*2ML", "4萬(wàn)單位*10支", "100ml*0.1g", "1g", "80萬(wàn)單位", "2ml*10支", "5毫克*60片", "1ml:10mg", "4萬(wàn)*2ml*10支", "20ML*5支", "5ml", "2ml:40mg(4萬(wàn)單位)", "250ml", "0.5克*10支", "5ML;17.5MG", "2ML:0.5G*10支",})).RuleFor(x => x.Manufacturer, x => x.Random.ArrayElement(new string[]{"山東齊都藥業(yè)/山西云鵬", "侯馬霸王藥業(yè)/山西晉新雙鶴/天津新鄭/西安/貴州", "山西臨汾云鵬藥業(yè)、山東齊都藥業(yè)/山西銀湖/石家莊四藥/河南科倫", "安徽聯(lián)誼/無(wú)錫", "揚(yáng)子江藥業(yè)集團(tuán)", "新鄉(xiāng)常樂(lè)制藥/山西太原藥業(yè)/天津焦作/鄭州", "天津藥業(yè)焦作", "山東方明藥業(yè)集團(tuán)股份有限公司", "石家莊四藥有限公司", "湖南一格制藥有限公司", "哈爾濱", "通化華夏制藥有限責(zé)任公司", "德州德藥制藥有限公司", "揚(yáng)子江藥業(yè)", "山西晉新雙鶴藥業(yè)/新鄉(xiāng)市新輝藥業(yè)/河南潤(rùn)弘", "河南輔仁懷慶堂制藥/濮陽(yáng)市匯元藥業(yè)/新鄉(xiāng)常樂(lè)", "廣西裕源藥業(yè)、四川科倫大藥廠", "成都天臺(tái)山制藥有限公司", "華北制藥", "安陽(yáng)九州藥業(yè)、山東方明藥業(yè)/石藥銀湖制藥", "牡丹江友博藥業(yè)有限公司", "濮陽(yáng)匯元/天津藥業(yè)集團(tuán)新鄭", "天津藥業(yè)焦作/侯馬", "湖南科倫/焦作民康", "貴州益佰制藥股份有限公司", "新鄉(xiāng)市新輝藥業(yè)/新鄉(xiāng)常樂(lè)制藥/濮陽(yáng)市匯元藥業(yè)", "山東華魯制藥/山東齊都/山西云鵬制藥/西安漢豐", "重慶圣華曦藥業(yè)",}));goodses.Add(goodsFaker.Generate());}return goodses;}

第一版:

csv文件格式是utf8

public class BasisCsvHandle : ICsvHandle {public List<Goods> ReadCsv(string file){var config = new CsvConfiguration(CultureInfo.InvariantCulture){NewLine = "\r\n"};using (var reader = new StreamReader(file))using (var csv = new CsvReader(reader, config)){var goodses = csv.GetRecords<Goods>();return goodses.ToList();}}public void WriteCsv(string file, List<Goods> goodses){var config = new CsvConfiguration(CultureInfo.InvariantCulture){NewLine = "\r\n"};using (var writer = new StreamWriter(file)){using (var csv = new CsvWriter(writer, config)){csv.WriteRecords(goodses);}}} }

后來(lái)有的客戶要BOM類型的UTF8,其實(shí)就是在文件開(kāi)頭加上byte[] BOM = { 0xEF, 0xBB, 0xBF };這個(gè)字節(jié)數(shù)組就ok

為了適配合有無(wú)BOM和非BOM的UTF8,對(duì)接口進(jìn)行了重構(gòu),增加默認(rèn)屬性(正好練一下接口默認(rèn)屬性的用法),這種做法的好處是不打擾BasisCsvHandle的代碼,當(dāng)然,也可以更深層的重構(gòu)ICsvHandle中的兩個(gè)方法來(lái)適配是否是BOM UTF8

public interface ICsvHandle {List<Goods> ReadCsv(string file);void?WriteCsv(string?file,?List<Goods>?goodses);private static bool _isBOM;public bool IsBOM { get => _isBOM; set => _isBOM = value; } }

第二版:

public class StrengthenCsvHandle : ICsvHandle {public List<Goods> ReadCsv(string file){MemoryStream memory = null;using (var reader = new FileStream(file, FileMode.OpenOrCreate, FileAccess.ReadWrite)){var bytes = new byte[reader.Length];reader.Read(bytes, 0, bytes.Length);if (((ICsvHandle)this).IsBOM){bytes = bytes.Skip(3).Take(bytes.Length - 3).ToArray();}memory = new MemoryStream(bytes);}var config = new CsvConfiguration(CultureInfo.InvariantCulture){NewLine = "\r\n"};using (var reader = new StreamReader(memory))using (var csv = new CsvReader(reader, config)){var goodses = csv.GetRecords<Goods>();return goodses.ToList();}}public void WriteCsv(string file, List<Goods> goodses){var config = new CsvConfiguration(CultureInfo.InvariantCulture){NewLine = "\r\n"};using (var writer = new StreamWriter(file)){using (var csv = new CsvWriter(writer, config)){csv.WriteRecords(goodses);}}if (((ICsvHandle)this).IsBOM){//追究加BOMusing (var writer = new FileStream(file, FileMode.OpenOrCreate, FileAccess.ReadWrite)){var bytes = new byte[writer.Length];writer.Read(bytes, 0, bytes.Length);byte[] BOM = { 0xEF, 0xBB, 0xBF };var list = new List<byte>();list.AddRange(BOM);list.AddRange(bytes);writer.Position = 0;writer.Write(list.ToArray(), 0, list.Count);}}} }

雖然能實(shí)現(xiàn)功能,但是覺(jué)得這樣的代碼太啰嗦,這里的本質(zhì)就是在寫數(shù)據(jù)時(shí)加上三個(gè)字節(jié),讀取數(shù)據(jù)時(shí),少讀三個(gè)字節(jié)直覺(jué)告訴我,應(yīng)該好像也許或者能有更簡(jiǎn)單的方式。

第三版:

public class PerfectCsvHandle : ICsvHandle {public List<Goods> ReadCsv(string file){var config = new CsvConfiguration(CultureInfo.InvariantCulture){NewLine = "\r\n"};using (var reader = new StreamReader(file))using (var csv = new CsvReader(reader, config)){if (((ICsvHandle)this).IsBOM){reader.BaseStream.Position = 3;}var goodses = csv.GetRecords<Goods>();return goodses.ToList();}}public void WriteCsv(string file, List<Goods> goodses){var config = new CsvConfiguration(CultureInfo.InvariantCulture){NewLine = "\r\n"};using (var writer = new StreamWriter(file)){using (var csv = new CsvWriter(writer, config)){if (((ICsvHandle)this).IsBOM){byte[] BOM = { 0xEF, 0xBB, 0xBF };writer.Write(System.Text.Encoding.UTF8.GetString(BOM));}csv.WriteRecords(goodses);}}} }

總結(jié)

以上是生活随笔為你收集整理的撸码是需要直觉的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。