/// <summary> /// 实体类的新旧值比较方法(参数1 新的实体类,参数二 旧实体类,参数三 需要比较的属性的集合,参数四 需要比较的集合的显示值) /// </summary> /// <param name="newAverage">新实体类</param> /// <param name="oldAverage">旧实体类</param> /// <param name="compareAttribute">需要比较的属性集合</param> /// <param name="compareAttributeName">需要比较的属性集合的中文名集合</param> /// <returns>返回有差异的数据的拼接字符串</returns> public static string ModelCompare(object newAverage, object oldAverage, List<string> compareAttribute, List<string> compareAttributeName) { if (newAverage == null || oldAverage == null) { return "传入比较值为空,请检查传入值!"; } if (compareAttribute.Count() != compareAttributeName.Count()) { return "传入的要比较的列与对应的显示值数量不等,请检查要比较的列的数量与对应显示列的数量!"; } string differentThing = null; List<object> newValue = new List<object>(); List<object> oldValue = new List<object>(); //判断是否有修改 bool isDiffOrNot = false; try { // 只有两个对象都是同一类型的才有可比性 if (newAverage.GetType() == oldAverage.GetType()) { foreach (string item in compareAttribute) { //获取新值的要比较项的集合 foreach (PropertyInfo pi in newAverage.GetType().GetProperties()) { string name = pi.Name.ToString(); object value = pi.GetValue(newAverage, null); if (item.Equals(name)) { newValue.Add(value); break; } } } foreach (var item in compareAttribute) { //获取旧值的要比较项的集合 foreach (PropertyInfo pi in oldAverage.GetType().GetProperties()) { string name = pi.Name; object value = pi.GetValue(oldAverage, null); if (item.Equals(name)) { oldValue.Add(value); break; } } } //新旧值比较,有不同的就添加到返回值中去 for (int i = 0; i < newValue.Count(); i++) { if (string.IsNullOrWhiteSpace(Convert.ToString(newValue[i])) && string.IsNullOrWhiteSpace(Convert.ToString(oldValue[i]))) { } else if (!string.IsNullOrWhiteSpace(Convert.ToString(newValue[i])) && string.IsNullOrWhiteSpace(Convert.ToString(oldValue[i]))) { isDiffOrNot = true; differentThing += compareAttributeName[i] + ":无数据-->>" + newValue[i] + ";"; } else if (string.IsNullOrWhiteSpace(Convert.ToString(newValue[i])) && !string.IsNullOrWhiteSpace(Convert.ToString(oldValue[i]))) { isDiffOrNot = true; differentThing += compareAttributeName[i] + ":" + oldValue[i] + "-->>无数据;"; } else { if (!newValue[i].Equals(oldValue[i])) { isDiffOrNot = true; differentThing += compareAttributeName[i] + ":" + oldValue[i] + "-->>" + newValue[i] + ";"; } } } if (!isDiffOrNot) differentThing = "新旧值无变化!"; } else differentThing = "请输入相同类型进行比较!"; } catch (Exception ex) { //Common.WriteDayLog("ModelCompare\r\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n" + ex.Message + "\r\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n" + DateTime.Now); throw; } return differentThing; } /// <summary> /// 集合类的新旧值比较方法(参数1 新的实体类的集合,参数二 旧实体类的集合,参数三 需要比较的属性的集合,参数四 需要比较的集合的显示值) /// </summary> /// <param name="newAverages">新集合类</param> /// <param name="oldAverages">旧集合类</param> /// <param name="compareAttribute">需要比较的属性的集合</param> /// <param name="compareAttributeName">需要比较的属性集合的中文名集合</param> /// <param name="matchAveragesAttribute">用来整理新旧集合的属性名</param> /// <returns>返回有差异的数据的拼接字符串的集合</returns> public static List<string> LstCompare<T>(List<T> newAverages, List<T> oldAverages, List<string> compareAttribute, List<string> compareAttributeName, string matchAveragesAttribute) { List<string> differentThings = new List<string>(); if (newAverages.Count() == 0 || oldAverages.Count() == 0) { differentThings.Add("传入比较的集合有一个或多个为空,请检查传入值!"); } if (compareAttribute.Count() != compareAttributeName.Count()) { differentThings.Add("传入的要比较的列与对应的显示值数量不等,请检查要比较的列的数量与对应显示列的数量!"); } //数量不等时调用matchAveragesAttribute整理新旧集合数量 int addAverages = 0;//指定多出来的数据列是添加还是删除(0、不变;1、添加;2、删除) List<T> diffAttributeValue = new List<T>();//原集合中多出来的数据列 if (newAverages.Count() != oldAverages.Count()) { //开始匹配整理集合 if (newAverages.Count() > oldAverages.Count()) { addAverages = 1; diffAttributeValue = NotFindAverages(newAverages.ToList(), oldAverages.ToList(), matchAveragesAttribute); foreach (var item in diffAttributeValue) { newAverages.Remove(item); } } else { addAverages = 2; diffAttributeValue = NotFindAverages(oldAverages.ToList(), newAverages.ToList(), matchAveragesAttribute); foreach (var item in diffAttributeValue) { oldAverages.Remove(item); } } } int count = 0; int countdiff = 1; try { //集合内包含的数据列一样多才有意义 if (newAverages.Count() == oldAverages.Count()) { foreach (var item in newAverages) { string diffT = ModelCompare(item, oldAverages[count], compareAttribute, compareAttributeName); if (diffT.Contains(";")) { diffT = "【第" + countdiff + "条修改项】" + diffT; differentThings.Add(diffT); countdiff++; } count++; } } string addOrDelete = null; if (addAverages == 1) { addOrDelete = SplicingAveragesValue(diffAttributeValue, compareAttribute, compareAttributeName); differentThings.Add("【添加】;" + addOrDelete); } else if (addAverages == 2) { addOrDelete = SplicingAveragesValue(diffAttributeValue, compareAttribute, compareAttributeName); differentThings.Add("【删除】;" + addOrDelete); } } catch (Exception ex) { //Common.WriteDayLog("LstCompare\r\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n" + ex.Message + "\r\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n" + DateTime.Now); throw; } return differentThings; } /// <summary> /// 根据标志属性筛选出两个集合类中不同的类的集合(参数1 数量较多的集合,参数二 数量较少的集合,参数三 标志属性) /// </summary> /// <param name="bigAverages">数量较多的集合</param> /// <param name="smallAverages">数量较少的集合</param> /// <param name="matchAveragesAttribute">标志属性</param> /// <returns>返回找出来的类的集合</returns> public static List<T> NotFindAverages<T>(List<T> bigAverages, List<T> smallAverages, string matchAveragesAttribute) { List<T> diffAttributeValue = new List<T>(); foreach (var item in bigAverages) { foreach (PropertyInfo pi in item.GetType().GetProperties()) { string name = pi.Name.ToString(); object value = pi.GetValue(item, null); if (matchAveragesAttribute.Equals(name)) { bool isNotFind = true; foreach (var item2 in smallAverages) { foreach (PropertyInfo pi2 in item2.GetType().GetProperties()) { string name2 = pi2.Name.ToString(); object value2 = pi2.GetValue(item2, null); if (matchAveragesAttribute.Equals(name2)) { if (value.ToString() == value2.ToString()) { isNotFind = false; } break; } } if (!isNotFind) { break; } } if (isNotFind) { diffAttributeValue.Add(item); } break; } } } return diffAttributeValue; } /// <summary> /// 拼接多余的实体类与显示属性对应成字符串 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="diffAttributeValue"></param> /// <param name="compareAttribute"></param> /// <param name="compareAttributeName"></param> /// <returns></returns> public static string SplicingAveragesValue<T>(List<T> diffAttributeValue, List<string> compareAttribute, List<string> compareAttributeName) { string addOrDelete = null; try { foreach (var item3 in diffAttributeValue) { int count = 0; foreach (string item in compareAttribute) { foreach (PropertyInfo pi in item3.GetType().GetProperties()) { string name = pi.Name.ToString(); object value = pi.GetValue(item3, null); if (item.Equals(name)) { addOrDelete += compareAttributeName[count] + ":" + value + ";"; break; } } count++; } } } catch (Exception ex) { addOrDelete = ex.Message; throw; } return addOrDelete; }