1 var stockMaterials = this._PEService.GetStockMaterial(materialSnList).AsEnumerable().Select(r => new 2 { 3 MaterialCode = r["MaterialCode"]?.ToString(), 4 MaterialName = r["MaterialName"]?.ToString(), 5 MaterialSn = r["MaterialSn"]?.ToString(), 6 MaterialQty = int.MaxValue 7 }).ToList();
过程:查库返回DataTable类型 ,转化成枚举查询 ,返回一个枚举型IEumerable类型(解释意思是可枚举的)接着转化成ToList(),
注意点:起先我用他的原List名去接收,结果拿到的是IEumerable类型,这时发现这个materialList不能使用List带的. ForEach() 方法
比较:比较传统的分支循环写法,Linq很方便,给程序员带来的便利;但是有个问题就是,用linq耦合很严重,即使你有注释,别人改你的BUG根本看不懂,并不知道你随手造的匿名对象和随手用的匿名对象到底要干嘛,总的来说就是可读性不高。关于方便 与 逻辑性的思考 我想代码应该是越简单性能越稳定,一味追求linq反而增加工作量。
一个知识点多咀嚼一下总是好的,再来一个例子~~
1 var result = materialSnList.Select(materialSn => 2 { 3 string msg = ""; string msgCode = ""; bool isOk = true; string materialCode = ""; int stepNo = -1; 4 //bool tempFlag = false; 5 var tempMaterials = stockMaterials.Where(m => m.MaterialSn == materialSn).ToList(); 6 if (tempMaterials.Count == 0) 7 { 8 msg = "码不存在"; msgCode = "11"; isOk = false; 9 } 10 else if (tempMaterials.Count > 1) 11 { 12 msg = "库存异常"; msgCode = "21"; isOk = false; 13 } 14 else 15 { 16 materialCode = tempMaterials[0].MaterialCode; 17 if (tempMaterials[0].MaterialQty < 1) 18 { 19 msg = "库存不足"; msgCode = "22"; isOk = false; 20 } 21 foreach (var step in workInfo.CrfStepList) 22 { 23 var mConfig = step.MaterialList.FirstOrDefault(mc => mc.MaterialCode == materialCode); 24 if (mConfig != null) 25 { 26 stepNo = step.StepNo; 27 break; 28 } 29 } 30 if (stepNo < 0) 31 { 32 //tempFlag = true; 33 msg = "非该工位物料"; msgCode = "12"; isOk = false; 34 } 35 } 36 return new OutCheckLoadedMaterialDTO 37 { 38 StepNo = stepNo, 39 MaterialSn = materialSn, 40 MaterialCode = materialCode, 41 IsOk = isOk, 42 MsgCode = msgCode, 43 MsgDesc = msg 44 };
说实话,这种代码写出来是不是看都不想看,功能实现了,但除了自己,谁看得懂,流程异常,BUG谁又能改,一个就算了 7个 8个呢
第二个缺点就是校验写的过于分散且没有必要,不打注释
众所周知,swith case 结构性,可读性比if 好,if里面代码乱钻,此处可改。