惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - lhx

C# 非活动窗口截屏 用32位应用程序读取64位注册表中的Office key WMI 查找所有物理网卡 [转:IE编程] 如何设置IE8的WebBrowser控件(MSHTML) 的渲染模式 C#实现根据图片的EXIF自动调整图片方向<转> memory released when you minimize the app 自定义控件属性的特性大全<转> 详解自定义托管宿主WCF解决方案开发配置过程(1)【转】 .NET 特性Attribute 如何给DataGridViewComboBoxColumn写事件 将Excel的数据导入DataGridView中[原创] 将DataGridView选中行的值填充到符合命名规则的控件中[原创] Oracle 存储过程 例子~! oracle 存储过程的基本语法(转) 在linux下配置Struts中的Oracle 数据源(原创) 如何给linux添加新硬盘(转) linux 下 mysql-5.0.22. 的安装(转) jQuery Ajax 全解析 (转) tomcat6_jdk1.6_安装配置_开启自动运行,普通用户执行 (转)
对比两个同类型的List<T>返回差异List<T>集合 - lhx - 博客园
lhx · 2009-01-05 · via 博客园 - lhx

原创,转载请注明出处

http://www.cnblogs.com/lhxhappy/archive/2009/01/05/1368635.html

 /// <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;
        }