Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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);
        }