C#对于任意对象进行深度值比较
2013-03-01 15:23
369 查看
说明:
本文使用VS2010,C#
对于任意对象,任意类型进行深度值比较
1. DeepValueCompareArray
需要对Array中每一个item进行深度值比较(DeepValueCompare)。
2. DeepValueCompareGenericType
对于List,Dictionary类型,也是对每一个item进行深度值比较(DeepValueCompare)。
3. DeepValueCompare
入口函数,两个参数,两个要比较的对象。
采用递归,代码比较简单,直接上代码:
本文使用VS2010,C#
对于任意对象,任意类型进行深度值比较
1. DeepValueCompareArray
需要对Array中每一个item进行深度值比较(DeepValueCompare)。
private static bool DeepValueCompareArray(Array srcArray, Array comparedArray) { if (srcArray.Length != comparedArray.Length) { return false; } for (int i = 0; i < srcArray.Length; i++) { // compare each item if (DeepValueCompare(srcArray.GetValue(i), comparedArray.GetValue(i)) == false) { return false; } } return true; }
2. DeepValueCompareGenericType
对于List,Dictionary类型,也是对每一个item进行深度值比较(DeepValueCompare)。
private static bool DeepValueCompareGenericType(object src, object compared) { try { IList srcList = src as IList; IList comparedList = compared as IList; if (srcList.Count != comparedList.Count) { return false; } for (int i = 0; i < srcList.Count; i++) { // compare each object in list if (DeepValueCompare(srcList[i], comparedList[i]) == false) { return false; } } return true; } catch (Exception) { try { IDictionary srcDictionary = src as IDictionary; IDictionary comparedDictionary = compared as IDictionary; if (srcDictionary.Count != comparedDictionary.Count) { return false; } foreach (object o in srcDictionary.Keys) { // compare each object in map if (DeepValueCompare(comparedDictionary[o], srcDictionary[o]) == false) { return false; } } return true; } catch (Exception) { return false; } } }
3. DeepValueCompare
入口函数,两个参数,两个要比较的对象。
采用递归,代码比较简单,直接上代码:
public static bool DeepValueCompare(object srcobj , object compareToObj) { if (srcobj == null && compareToObj == null) { return true; } if (srcobj == null || compareToObj == null) { return false; } Type srcType = srcobj.GetType(); Type compareToType = compareToObj.GetType(); if (srcType != compareToType) { return false; } if (srcType.IsValueType) { if (srcobj.Equals(compareToObj)) return true; return false; } if (srcType.IsArray) { return DeepValueCompareArray(srcobj as Array, compareToObj as Array); } else if (srcType.IsGenericType || srcType.FullName == "System.Collections.Hashtable") { return DeepValueCompareGenericType(srcobj, compareToObj); } else if (srcobj is IComparable) { // is object support IComparable interface if ((srcobj as IComparable).CompareTo(compareToObj) != 0) return false; return true; } else { // Find out all fields or properties, do deep compare BindingFlags bflags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; MemberInfo[] memberCollection = srcType.GetMembers(bflags); foreach (MemberInfo member in memberCollection) { if (member.MemberType == MemberTypes.Field) { FieldInfo field = (FieldInfo)member; if (DeepValueCompare(field.GetValue(srcobj), field.GetValue(compareToObj)) == false) { return false; } } else if (member.MemberType == MemberTypes.Property) { PropertyInfo property = (PropertyInfo)member; if (DeepValueCompare(property.GetValue(srcobj, null), property.GetValue(compareToObj, null)) == false) { return false; } } } } return true; }
相关文章推荐
- C#对于任意对象进行深拷贝(DeepCopy)
- 论各种操作js数组去重 (附个人深度去重法:见3——针对对象进行强比较去重)
- [c#] 利用序列化进行对象深度clone
- c#:如何处理对对象进行深度拷贝
- Unity3d(C#)错误提示:禁止在线程中进行游戏对象比较!
- C#基础:通过委托给任何对象数组进行排序
- 对于集合中的自定义对象使用collections.sort 进行排序,需要实现compartor接口
- json工具性能比较:json-lib和jackson进行Java对象到json字符串序列化[转]
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- C# 任意输入一段表达式,进行运算并输出
- 对象的比较与排序(七):对泛型列表进行排序和搜索:Comparison<T>和Predicate<T>的应用
- C#对象的比较
- C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十五)制作精美的可任意拖放对象的物品栏及装备栏
- Effective Java 对于所有对象都通用的方法 12.考虑实现Comparable(可以比较)接口
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- C#中List<T>对象的深度拷贝问题
- windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放
- c#创建可比较对象
- C#中对于一个小数进行四舍五入