コード例 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        /// <param name="item"></param>
        /// <param name="option"></param>
        /// <param name="isSrc">标识此数据是T1还是T2的数据</param>
        protected CompareItem(object key, object item, CompareOption <T1, T2> option, bool isSrc = false)
        {
            this.Item   = item;
            this.Key    = key;
            this.Option = option;
            var properties = item.GetType().GetProperties();

            foreach (var property in properties)
            {
                if (isSrc)
                {
                    //
                    if (Option.ColumnsToCompare.ContainsKey(property.Name) ||
                        property.Name == Option.ColumnNameOfRemove)
                    {
                        ColumnsValue.Add(property.Name, property.GetValue(item));
                    }
                }
                else
                {
                    if (Option.ColumnsToCompare.ContainsValue(property.Name))
                    {
                        ColumnsValue.Add(property.Name, property.GetValue(item));
                    }
                }
            }
        }
コード例 #2
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="key"></param>
 /// <param name="item"></param>
 /// <param name="option"></param>
 public CompareSrcItem(object key, object item, CompareOption <T1, T2> option)
     : base(key, item, option, true)
 {
 }
コード例 #3
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="key"></param>
 /// <param name="item"></param>
 /// <param name="option"></param>
 public CompareDstItem(object key, object item, CompareOption <T1, T2> option)
     : base(key, item, option, false)
 {
 }
コード例 #4
0
        public static List <CompareResultItem <T1> > Compare <T1, T2>(IEnumerable <T1> src, IEnumerable <T2> dst, CompareOption <T1, T2> option)
        {
            //返回结果集
            var srcList = new List <CompareResultItem <T1> >();

            //先构造内部用于比较的数据集
            Dictionary <object, CompareItem <T1, T2> > srcCollection = new Dictionary <object, CompareItem <T1, T2> >();

            foreach (var item in src)
            {
                if (item != null)
                {
                    var key         = option.GetSrcId(item);
                    var compareItem = new CompareSrcItem <T1, T2>(key, item, option);
                    srcCollection.Add(key, compareItem);
                }
            }
            Dictionary <object, CompareItem <T1, T2> > dstCollection = new Dictionary <object, CompareItem <T1, T2> >();

            foreach (var item in dst)
            {
                if (item != null)
                {
                    var key         = option.GetDstId(item);
                    var compareItem = new CompareDstItem <T1, T2>(key, item, option);
                    dstCollection.Add(key, compareItem);
                }
            }

            //从T1的集合中查找T2的集合
            //如果没找到,说明此数据从T2中删除了
            //如果找到了,那么就此对比具体的成员值
            //(每次找到后,要从T2集合移除,最后剩下的就全是新增的)
            foreach (var item in srcCollection)
            {
                if (dstCollection.ContainsKey(item.Key))
                {
                    CompareItem <T1, T2> compareItem2 = dstCollection[item.Key];
                    if (item.Value.IsDeleted() ||
                        item.Value.IsDifferent(compareItem2))
                    {
                        //目标数据集中被更新
                        option.ModifyItem((T1)item.Value.Item, (T2)compareItem2.Item);
                        srcList.Add(new CompareResultItem <T1>()
                        {
                            Item   = (T1)item.Value.Item,
                            Result = CompareResult.Modify
                        });
                    }

                    dstCollection.Remove(item.Key);
                }
                else
                {
                    option.RemoveItem((T1)item.Value.Item);
                    //目标数据集中被删除
                    srcList.Add(new CompareResultItem <T1>()
                    {
                        Item = (T1)item.Value.Item, Result = CompareResult.Delete
                    });
                }
            }
            //最后剩下的就全是新增的(每次找到后,会从T2集合移除)
            foreach (var item in dstCollection)
            {
                T1 t1 = option.CreateNewItem((T2)item.Value.Item);
                //目标数据集中是新增的
                srcList.Add(new CompareResultItem <T1>()
                {
                    Item = t1, Result = CompareResult.New
                });
            }
            dstCollection.Clear();

            return(srcList);
        }