/// <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. python3 得到a.txt中有的而b.txt中没有的汉字

    已知两个文本文档,求a.txt中有的而b.txt中没有的汉字 #读取list1中的汉字 f1=open('/Users/tanchao/Documents/pythonwork/tensorflow/ ...

  2. Dapper使用总结

  3. Html写作规范

    HTML是描述网页结构的超文本标记语言,HTML规范能够使HTML代码风格保持一致,使得HTML更容易理解和维护. 整体结构 用编辑器快捷键一键搞定 <!DOCTYPE html>---- ...

  4. Java NIO Path

    Java NIO Path Creating a Path Instance Creating an Absolute Path Creating a Relative Path Path.norma ...

  5. .net 代理类(WebService代理类的详解 )

    http://hi.baidu.com/654085966/item/53ee8c0f108ad78202ce1b1d   -----------转自 客户端调用Web Service的方式我现在知道 ...

  6. jms版本

    Java消息服务是一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914). 2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1 ...

  7. MySQL 按指定字段自定义列表排序

    问题描述 大家都知道, mysql 中按某字段升序排列的 SQL 为 (以 id 为例, 下同): SELECT * FROM `MyTable` WHERE `id` IN (1, 7, 3, 5) ...

  8. PHPActiveRecord 学习二

    ORM关联查询 a.一对多 针对外键来说 谁属于谁 谁有谁 user表 CREATE TABLE `user` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `na ...

  9. java实现person类 override(重写) comparable接口

    具体题目如下: 定义一个Person类,包含姓名(name).身高(height).体重(weight),以及talk()方法,该方法的功能是,输出自己的身高和体重信息.Person类实现Compar ...

  10. 获取标签as3.0

    import flash.utils.Timer; import flash.events.TimerEvent; var time:Timer=new Timer(25); time.addEven ...