对比两个同类型的List返回差异List集合
2010-05-24 11:45
323 查看
/article/6029968.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;
}
/// <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;
}
相关文章推荐
- 对比两个同类型的List返回差异List集合
- 对比两个同类型的List返回差异List集合
- 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List<类名>的比较
- 对比两个list<object> 得到相同数据 差异数据
- 有两个不同list,需要对比两个list内容且输出差异的内容
- 取出两个list集合中不同的元素
- 工作总结 c#如何将两个List集合合并
- 利用DWR处理回调函数返回的list集合,并填充select
- Java 集合:Collection,List,ArrayList,Vector,LinkedList(实现方式,对比)
- java两个字符串的差异对比与显示(8/25修订)
- 写student类中的select,delete,update,insert方法并在objectDataSource中应用(分别写两个,一个返回datatable,一个使用list)
- 通过反射从数据库返回集合ResultSet中得到实体对象的list集合
- 合并两个字符集合为一个新集合,每个字符串在新集合中仅出现一次,函数返回新集合中字符串。
- 合并两个list数据集合
- web页面两个list集合迭代,确定checkbox的checked状态
- java中两个list对比,查出增加和删除的数据然后去重
- Java中两个List对比的算法
- Java 集合:Collection,List,ArrayList,Vector,LinkedList(实现方式,对比)
- java方法,返回两个日期内的所有date集合,根据开始时间、结束时间得到两个时间段内所有的日期
- 两个List集合使用removeAll()方法遇到的坑,无法移除掉两个集合相同的数据。