/// <summary> /// 用列表1 和 列表2 比较,获取不同部分: /// Removed - 在列表1 但不在列表 2中的部分; /// Added - 在列表2 但不在列表 1中的部分; /// Unmodified - 在列表1也在列表2中的部分; /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="K"></typeparam> /// <param name="srcList"></param> /// <param name="destList"></param> /// <param name="compare"></param> /// <param name="destNotExitsAction">如果项在列表1中但不在列表2中时</param> /// <param name="notChangeElementAction">如果项在列表1中且在列表2中时的处理方法</param> /// <param name="srcNotExitsAction">如果项在列表2中但不在列表1中时</param> /// <returns> /// Removed - 在列表1 但不在列表 2中的部分; /// Added - 在列表2 但不在列表 1中的部分; /// Unmodified - 在列表1也在列表2中的部分; /// /// </returns> public static Different <T, K> DifferentHandle <T, K>(this List <T> srcList, List <K> destList, Func <T, K, bool> compare, Action <T> destNotExitsAction, Action <T, K> notChangeElementAction, Action <K> srcNotExitsAction) { Different <T, K> result = new Different <T, K>(); if (IsNullOrEmpty(srcList) && IsNullOrEmpty(destList)) { return(result); } result.Removed = srcList.Where(a => !destList.Any(b => compare(a, b))).ToList(); result.Added = destList.Where(a => !srcList.Any(b => compare(b, a))).ToList(); result.Unmodified = srcList.Where(a => destList.Any(b => compare(a, b))).ToList(); if (destNotExitsAction != null && result.Removed != null) { result.Removed.ForEach(item => destNotExitsAction(item)); } if (srcNotExitsAction != null && result.Added != null) { result.Added.ForEach(item => srcNotExitsAction(item)); } if (notChangeElementAction != null && result.Unmodified != null) { result.Unmodified.ForEach(srcItem => { var destItem = destList.FirstOrDefault(a => compare(srcItem, a)); notChangeElementAction(srcItem, destItem); }); } return(result); }
/// <summary> /// 用列表1 和 列表2 比较,获取不同部分: /// Removed - 在列表1 但不在列表 2中的部分; /// Added - 在列表2 但不在列表 1中的部分; /// Unmodified - 在列表1也在列表2中的部分; /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="K"></typeparam> /// <param name="srcList"></param> /// <param name="destList"></param> /// <param name="compare"></param> /// <returns> /// Removed - 在列表1 但不在列表 2中的部分; /// Added - 在列表2 但不在列表 1中的部分; /// Unmodified - 在列表1也在列表2中的部分; /// </returns> public static Different <T, K> Different <T, K>(this List <T> srcList, List <K> destList, Func <T, K, bool> compare) { Different <T, K> result = new Different <T, K>(); if (IsNullOrEmpty(srcList) && IsNullOrEmpty(destList)) { return(result); } result.Removed = srcList.Where(a => !destList.Any(b => compare(a, b))).ToList(); result.Added = destList.Where(a => !srcList.Any(b => compare(b, a))).ToList(); result.Unmodified = srcList.Where(a => destList.Any(b => compare(a, b))).ToList(); return(result); }
/// <summary> /// 用列表1 和 列表2 比较,获取不同部分: /// Removed - 在列表1 但不在列表 2中的部分; /// Added - 在列表2 但不在列表 1中的部分; /// Unmodified - 在列表1也在列表2中的部分; /// </summary> /// <typeparam name="T"></typeparam> /// <param name="srcList"></param> /// <param name="destList"></param> /// <param name="compare"></param> /// <returns> /// Removed - 在列表1 但不在列表 2中的部分; /// Added - 在列表2 但不在列表 1中的部分; /// Unmodified - 在列表1也在列表2中的部分; /// </returns> public static Different <T> Different <T>(this T[] srcList, T[] destList, Func <T, T, bool> compare = null) { Different <T> result = new Different <T>(); if (ArrayUtil.IsNullOrEmpty(srcList) && ArrayUtil.IsNullOrEmpty(destList)) { return(result); } BuildCompare <T, T>(ref compare); result.Removed = srcList.Where(a => !destList.Any(b => compare(a, b))).ToList(); result.Added = destList.Where(a => !srcList.Any(b => compare(a, b))).ToList(); result.Unmodified = destList.Where(a => srcList.Any(b => compare(a, b))).ToList(); return(result); }
/// <summary> /// 判断数组是否具有不同项(不管顺序),特别注意,返回值; /// </summary> /// <typeparam name="T"></typeparam> /// <param name="srcList"></param> /// <param name="destList"></param> /// <param name="compare"></param> /// <returns> true 时,数组没有不同项,false时,数组有不同项;</returns> public static bool HaveDifferent <T>(this T[] srcList, T[] destList, Func <T, T, bool> compare = null) { if (ArrayUtil.IsNullOrEmpty(srcList) && ArrayUtil.IsNullOrEmpty(destList)) { return(false); } BuildCompare <T, T>(ref compare); Different <T> result = new Different <T>(); if (srcList.Any(a => !destList.Any(b => compare(a, b)))) { return(false); } if (destList.Any(a => !srcList.Any(b => compare(a, b)))) { return(false); } return(true); }
/// <summary> /// 用列表1 和 列表2 比较,获取不同部分: /// Removed - 在列表1 但不在列表 2中的部分; /// Added - 在列表2 但不在列表 1中的部分; /// Unmodified - 在列表1也在列表2中的部分; /// </summary> /// <typeparam name="T"></typeparam> /// <param name="srcList"></param> /// <param name="destList"></param> /// <param name="compare"></param> /// <returns> /// Removed - 在列表1 但不在列表 2中的部分; /// Added - 在列表2 但不在列表 1中的部分; /// Unmodified - 在列表1也在列表2中的部分; /// </returns> public static Different <T> Different <T>(this List <T> srcList, List <T> destList, Func <T, T, bool> compare) { Different <T> result = new Different <T>(); if (IsNullOrEmpty(srcList) && IsNullOrEmpty(destList)) { return(result); } result.Removed = srcList.Where(a => { var existsInDest = destList.Any(b => compare(a, b)); if (existsInDest) { return(false); } else { return(true); } }).ToList(); //result.Removed = srcList.Where(a => !destList.Any(b => compare(a, b))).ToList(); //result.Added = destList.Where(a => !srcList.Any(b => compare(a, b))).ToList(); result.Added = destList.Where(a => { var existsInSrc = srcList.Any(b => compare(a, b)); if (existsInSrc) { return(false); } else { return(true); } }).ToList(); result.Unmodified = destList.Where(a => { var existsInSrc = srcList.Any(b => compare(a, b)); return(existsInSrc); }).ToList(); return(result); }
/// <summary> /// 是否具有逻辑上的不同项; /// </summary> /// <typeparam name="T"></typeparam> /// <param name="srcList"></param> /// <param name="destList"></param> /// <param name="compare"></param> /// <returns></returns> public static bool HaveDifferent <T>(this List <T> srcList, List <T> destList, Func <T, T, bool> compare = null) { if (IsNullOrEmpty(srcList) && IsNullOrEmpty(destList)) { return(false); } else if (IsNullOrEmpty(srcList)) { return(true); } Different <T> result = new Different <T>(); if (srcList.Any(a => !destList.Any(b => compare(a, b)))) { return(true); } if (destList.Any(a => !srcList.Any(b => compare(a, b)))) { return(true); } return(false); }