/// <summary>
/// 比对模型及属性数组
/// </summary>
/// <typeparam name="TM"></typeparam>
/// <param name="newList"></param>
/// <param name="oldList"></param>
/// <param name="keyField">模型Id</param>
/// <param name="keyArrField">模型可转换数组</param>
/// <returns></returns>
public static List<TM> CompareList<TM>(List<TM> newList, List<TM> oldList, string keyField,
string[] keyArrField)
{
List<TM> list = new List<TM>(); foreach (TM newModel in newList)
{
object nob = newModel.GetType().GetProperty(keyField).GetValue(newModel, null);
TM oldmodel = oldList.Find((delegate(TM old)
{
object ob = old.GetType().GetProperty(keyField).GetValue(old, null);
if (object.Equals(ob, nob)) return true;
else return false;
}));
if (oldmodel == null)
{
list.Add(newModel);
}
else
{
PropertyInfo[] pi = oldmodel.GetType().GetProperties();
foreach (PropertyInfo p in pi)
{
object o_new = p.GetValue(newModel, null);
object o_old = p.GetValue(oldmodel, null); if (keyArrField?.Contains(p.Name) ?? false)
{
if (o_new.IsNotNull() && o_old.IsNotNull())
{
var o_old_list = o_old.ToString().SplitList();
var o_new_list = o_new.ToString().SplitList();
if (o_old_list.Except(o_new_list).Any() ||
o_new_list.Except(o_old_list).Any())
{
list.Add(newModel);
break;
}
else
continue;
}
else if ((o_new == null || o_new.ToString() == string.Empty) && (o_old == null || o_old.ToString() == string.Empty))
{
continue;
}
else
{
list.Add(newModel);
break;
}
}
else
{
if (object.Equals(o_new, o_old))
continue;
else
{
list.Add(newModel);
break;
}
} }
}
} return list;
}

  做版本时候,需要对很多实体做比对,写了这个小工具。

比较两个List列表,取得List中不同项返回的更多相关文章

  1. React 点击删除列表中对应项(React 获取DOM中自定义属性)

    点击删除按钮,删除列表中对应项本来是React比较基础的应用,可是应用情况变得复杂了以后,我还真想了一会儿才搞定. 简化一下应用场景:点击新增按钮,增加一条输入框,点击输入框旁边的按钮,删除该输入框( ...

  2. pop 在列表中和字典中的区别

    pop 在列表中和字典中的区别 字典中 pop() 语法:dict.pop(key,[value]) 说明:删除指定键及对应的值,如果在字典中不存在键及value,则返回pop()中指定的key对应的 ...

  3. 散列表和JAVA中的hash

    引文 hello,今天写的数据结构是散列表(hash表),也算是一种基础数据结构了吧.学过计算机的人大概都能说出来这是个以空间换时间的东西,那么具体怎么实现的是今天要讨论的问题. 为什么需要它?主要还 ...

  4. 同一个项目,项目名称不一致,这两个项目同时在Eclipse中出现

    在Eclispse中,实际同一个项目,项目名称不一致,这两个项目同时在Eclipse中出现. ①打开项目文件夹,找到“.cproject”文件 ② 在<name>节点重命名 ③ 导入Ecl ...

  5. Flex 列表控件中的操作

    主要操作包括:显示提示,使用图标,编辑列表条目中数据. 1.使用数据提示: 当鼠标停留在条目上时,可以显示该条目的相关数据提示. 当利用滚动条时,可以显示滚动条的相关提示. 在列表控件中使用showD ...

  6. cxf,两个声明导致 ObjectFactory 类中发生冲突

    说明先,这里不管是client还是server端都是用java语言编写,如有写得不好,望原谅! 问题 http://localhost:8080/WEB-SMVC/cxf/userService?ws ...

  7. python---手动实现两个有序列表的合并

    可能又和标准的实现不一样, 但是自己的实现, 印象就会不一样的. # coding = utf-8 # 两个有序列表的合并,将two_list合并到one_list def merge_order_l ...

  8. python基础一 -------如何在列表字典集合中根据条件筛选数据

    如何在列表字典集合中根据条件筛选数据 一:列表 先随机生成一个列表,过滤掉负数 1,普通for循环迭代判断 2,filter()函数判断,filter(函数,list|tuple|string) fi ...

  9. 跟我学SharePoint 2013视频培训课程——排序、过滤在列表、库中的使用(10)

    课程简介 第10天,SharePoint 2013排序.过滤在列表.库中的使用. 视频 SharePoint 2013 交流群 41032413

随机推荐

  1. Pandas基础知识(一)

    Pandas的主要结构有DataFrame和Series. 生成一个Series对象. 关于部分Series的索引操作. Series也可以通过字典生成. DataFrame是一个表格型的数据,它既有 ...

  2. mysql 触发器介绍

    create trigger triggerName   after/before insert/update/delete on tableName  for each row   --这句话在my ...

  3. 跨年操作--new Date()

    //时间在2017/12/31 17:00 --- 2018/1/1 06:00区间,提示用户无法操作公告. //time.js (function(){ var date = new Date(); ...

  4. js实现简单拖拽效果

    方法如下: var params = { left: 0, top: 0, currentX: 0, currentY: 0, flag: false }; var getCss = function ...

  5. Openstack 集群,及常用服务的 高可用 haproxy配置

    一.介绍 配置文件位置(yum 安装):/etc/haproxy/haproxy.cfg 全局配置 #------------------------------------------------- ...

  6. Mysql 5.7 弱密码限制,及创建用户无密码用户

    一.介绍 1.haproxy Mysql 需要一个无密码登录的mysql用户. 2.Mysql 5.7 版本默认安装了 validate_password 插件,作用:要求密码的复杂度. 3.创建用户 ...

  7. java函数方法

    1.方法重载 (1)源代码 // MethodOverload.java // Using overloaded methods public class MethodOverload { publi ...

  8. 【校招面试 之 网络】第2题 TCP的可靠传输、流量控制、滑动窗口

    1.可靠传输 (1)三次握手 TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接: (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_S ...

  9. 【校招面试 之 C/C++】第14题 C++ 内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区(堆栈的区别)

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...

  10. Linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结(转)

    本文介绍了linux下的压缩程式tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar等程式,以及如何使用它们 ...