`

对比两个同类型的List返回差异List集合

    博客分类:
  • java
阅读更多
/// <summary>
/// 对比两个同类型的List<T>返回差异List<T>集合
/// Created by lhxhappy
/// 2009-01-05 01:08:30
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="newModel">修改后的数据集合</param>
/// <param name="oldModel">原始数据集合</param>
/// <returns>返回与原始集合有差异的集合</returns>
    private List<T> GetModiflyList<T>(List<T> newModel, List<T> oldModel)
        {
            List<T> list = new List<T>();
            foreach (T newMod in newModel)
            {
                bool IsExist = false;
                foreach (T oldMol in oldModel)
                {
                    //取得老实体对象的属性集合
                    PropertyInfo[] pi = oldMol.GetType().GetProperties();
                    //定义记数器
                    int i = 0;

                    //将老实体对象的没一个属性值和新实体对象进行循环比较
                    foreach (PropertyInfo p in pi)
                    {
                        //防止object.Equals时实例化对象发生异常
                        object o_new = newMod.GetType().GetProperty(p.Name).GetValue(newMod, null);
                        if (o_new == null)
                            o_new = (object)String.Empty;

                        //防止object.Equals时实例化对象发生异常
                        object o_old = p.GetValue(oldMol, null);
                        if(o_old == null)
                            o_old = (object)String.Empty;

                        //新老实体比较并记录成功次数
                        if (object.Equals(o_new, o_old))
                        {
                            i++;
                        }
                        //若成功次数和属性数目相等则说明已经存在或者没有发生过修改条出循环
                        if (i == pi.Length)
                        {
                            IsExist = true;
                            break;
                        }
                    }

                    //没有发生过修改条出循环
                    if (IsExist)
                        break;
                }

                //如果不存在则添加该实体到List<T>中
                if (!IsExist)
                    list.Add(newMod);

            }
            return list;
        }
二,根据数据主键对比进行差异结果的返回,可节省60%的循环次数
/// <summary>
        /// 对比两个同类型的List<T>返回差异List<T>集合
        /// Created by lhxhappy
        /// 2009-01-05 23:12:30
        /// </summary>
        /// <typeparam name="T">泛型类型</typeparam>
        /// <param name="newModel">修改后的数据集合</param>
        /// <param name="oldModel">原始数据集合</param>
        /// <param name="keyField">数据主键</param>
        /// <returns>返回与原始集合有差异的集合</returns>
        /// <summary>
        private List<T> GetModiflyList<T>(List<T> newModel, List<T> oldModel, string keyField)
        {
            int conin = 0;
            List<T> list = new List<T>();
            foreach (T newMod in newModel)
            {
                conin++;
                //取得新实体的数据主键值
                object nob = newMod.GetType().GetProperty(keyField).GetValue(newMod, null);
                if (nob == null)
                    nob = (object)string.Empty;


                bool IsExist = false;
                foreach (T oldMol in oldModel)
                {
                    conin++;
                    //取得老实体对象的属性集合
                    PropertyInfo[] pi = oldMol.GetType().GetProperties();
                    //定义记数器
                    int i = 0;

                    //取得老实体的数据主键值
                    object ob = oldMol.GetType().GetProperty(keyField).GetValue(oldMol, null);
                    if (ob == null)
                        ob = (object)string.Empty;

                    //如果新老实体主键值相等则进行属性的比较
                    if (object.Equals(nob, ob))
                    {

                        //将老实体对象的没一个属性值和新实体对象进行循环比较
                        foreach (PropertyInfo p in pi)
                        {
                            conin++;
                            //防止object.Equals时实例化对象发生异常
                            object o_new = newMod.GetType().GetProperty(p.Name).GetValue(newMod, null);
                            if (o_new == null)
                                o_new = (object)String.Empty;

                            //防止object.Equals时实例化对象发生异常
                            object o_old = p.GetValue(oldMol, null);
                            if (o_old == null)
                                o_old = (object)String.Empty;

                            //如果有差异则保存当前实体
                            if (object.Equals(o_new, o_old))
                                continue;
                            else
                            {
                                list.Add(newMod);
                                break;
                            }
                        }
                    }
                }
            }
            return list;
        }
三,效率更高的写法,


/// 对比两个同类型的List<T>返回差异List<T>集合
        /// Created by lhxhappy
        /// 2009-01-05 23:12:30
        /// </summary>
        /// <typeparam name="T">泛型类型</typeparam>
        /// <param name="newModel">修改后的数据集合</param>
        /// <param name="oldModel">原始数据集合</param>
        /// <param name="keyField">数据主键</param>
        /// <returns>返回与原始集合有差异的集合</returns>
        private List<T> GetModiflyList<T>(List<T> newModel, List<T> oldModel, string keyField)
        {
            int conint = 0;
            List<T> list = new List<T>();
            foreach (T newMod in newModel)
            {
                conint++;

                //取得新实体的数据主键值
                object nob = newMod.GetType().GetProperty(keyField).GetValue(newMod, null);
            

                //根据主建找到老实体集合中主键值相等的实体
                T oldMol = oldModel.Find((delegate(T old)
                       {
                           object ob = old.GetType().GetProperty(keyField).GetValue(old, null);

                           if (object.Equals(ob, nob))
                               return true;
                           else
                               return false;
                       }));

                PropertyInfo[] pi = oldMol.GetType().GetProperties();

                //将老实体对象的没一个属性值和新实体对象进行循环比较
                foreach (PropertyInfo p in pi)
                {
                    conint++;

                    object o_new = p.GetValue(newMod, null);
                    object o_old = p.GetValue(oldMol, null);
                  
                    //新老实体比较并记录有差异的实体
                    if (object.Equals(o_new, o_old))
                        continue;
                    else
                    {
                        list.Add(newMod);
                        break;
                    }
                }

            }
            return list;
分享到:
评论

相关推荐

    java List 深度复制方法

    这样,新旧两个List中的对象是独立的,修改其中一个不会影响另一个。 当然,对于非序列化友好的类,我们可以选择手动复制每个元素。例如,假设我们有一个User类: ```java public class User { private String ...

    C# ObservableCollection与List

    在.NET框架中,C#提供了多种数据集合类用于存储和管理对象,其中`ObservableCollection`和`List&lt;T&gt;`是两种常见的类型。它们都是用于创建可变列表,但有着不同的应用场景和特性。 首先,我们来详细了解`List&lt;T&gt;`。`...

    实验七:Java集合与泛型

    在本次实验中,我们深入学习了Java集合框架中的两个主要部分:List接口和Map接口,以及它们的主要实现类,并探讨了泛型的概念。 首先,我们了解了集合的概念,它是一个可以存储多个对象的容器。集合框架的体系结构...

    c# 两个数组比较,将重复部分去掉,返回不重复部分的实现

    本篇文章将详细介绍如何在C#中实现这个功能,通过一个具体的示例来展示如何比较两个数组,并将重复的部分去掉,返回只包含不重复元素的新数组。 首先,我们需要理解C#中的数组和列表(List)的基本概念。数组是一种...

    Java集合类List-Set-Map的区别和联系.doc

    Java提供的`Arrays`类提供了一些实用方法,如比较两个数组是否相等、填充数组、排序和二分搜索。 接下来,我们进入集合框架的核心部分。`Collection`接口是所有单值容器的基接口,分为两种主要类型:`List`和`Set`...

    c# List find()方法返回值的问题说明(返回结果为对象的指针)

    在C#编程中,`List&lt;T&gt;`是.NET框架中常用的一个集合类,它提供了许多方便的方法来操作列表数据,如查找、添加、删除等。其中,`Find()`方法是一个非常实用的查找功能,它允许我们通过指定一个条件来查找列表中满足该...

    day03_List、Set 每日作业卷1

    它包含compare(T o1, T o2)方法,用于比较两个对象并返回比较结果。Comparator可以在任何类的对象之间进行比较,即使这些类没有实现Comparable接口。 【LinkedList方法使用】 LinkedList是一种双向链表,除了继承...

    Java集合知识测试B.doc

    11. `ArrayList.contains(Object obj)`方法会比较传入的对象与集合中的元素,它依赖于对象的equals()方法来判断两个对象是否相等。如果返回true,表示集合包含obj,反之则不包含(abc正确,d错误)。 12. `list....

    Java集合关系

    ArrayList和LinkedList是List接口的两个主要实现。ArrayList基于动态数组,适合于随机访问,而LinkedList基于双向链表,适合于频繁的添加和删除操作。 Set接口不允许元素重复,它提供了唯一性保证。HashSet是最常用...

    java学习笔记之集合详细

    - `Collection`是最基础的接口,它有两个主要的子接口:`List`和`Set`。 - `List`接口的实现类有`ArrayList`、`LinkedList`和`Vector`。其中,`ArrayList`基于数组实现,查询快,插入删除慢;`LinkedList`使用链表...

    C#中IList&lt;T&gt;与List&lt;T&gt;的区别深入解析

    在C#编程中,`IList&lt;T&gt;`和`List&lt;T&gt;`是两个常见的泛型集合类,它们在使用上有显著的差异。本文将深入探讨这两个类的区别,并解释在何时选择使用它们。 首先,`IList&lt;T&gt;`是一个接口,它是`ICollection&lt;T&gt;`的子接口,...

    JAVA容器效率深度分析List

    首先,List是Java集合框架中的一个重要接口,它扩展了Collection接口,并规定了元素的有序性和可重复性。List接口的主要方法有add、get、set、remove等,允许我们按索引操作元素。 ArrayList是最常用的List实现之一...

    C#中数组、ArrayList和List三者的区别详解

    此外,当元素类型为值类型时,List的性能接近于同类型的数组,因为没有了装箱和拆箱的开销。 总结一下,数组固定容量、高效访问,适用于已知且不会改变大小的数据集合。ArrayList提供动态大小调整,但类型不安全且...

    C#源代码-等号和Equals的区别.zip

    这个接口包含一个`Equals(T other)`方法,专门用于同类型的对象比较,这样可以避免不必要的类型转换。 6. **`Equals`和`CompareTo`的区别** 虽然两者都涉及对象的比较,但`Equals`主要用于判断两个对象是否相等,...

    Java常见面试题(线程、集合、设计模式).zip

    5. **死锁**:两个或更多线程相互等待对方释放资源导致的僵局,需要避免和解决。 6. **线程池**:Executor框架允许创建和管理线程,提高性能和可控性,如ThreadPoolExecutor。 7. **Callable和Future**:Callable...

    删除其重复

    在 Java 中,数组是一种基本的数据结构,用于存储固定大小的同类型元素序列。数组可以存储基本类型的数据(如 int、double 等)或对象引用。 ## 二、实现去重逻辑 ### 1. 使用集合转换法去除重复项 #### 示例代码...

    张孝祥Java面试技巧

    `Collection`有两个主要的子接口——`List`和`Set`。 - **`List`**:这是一个有序集合,允许重复元素,并且可以通过索引访问其元素。`List`的主要实现包括`ArrayList`(基于动态数组)、`LinkedList`(基于链表)和...

    最全java面试题及答案(208道)

    当两个字符串的内容逐个字符对比都相同时,`equals()` 返回 true。 4. **构造函数和 equals()** 当自定义类时,如果类包含可变字段,应考虑重写 `equals()` 和 `hashCode()` 方法,确保正确的对象比较。如果不这样...

    Redis实战 中文.pdf

    - **SUNIONSTORE**: 返回两个集合的并集并将结果保存到指定的集合中。 - **SMOVE**: 将元素从一个集合移动到另一个集合。 - **SCARD**: 获取集合中元素的数量。 - **SISMEMBER**: 判断成员是否在集合中。 - **...

Global site tag (gtag.js) - Google Analytics