[英]How do I compare two objects' properties?
如何比較兩個對象的屬性以確定是否有任何屬性已更改? 我有一個具有一系列屬性的Patient
對象。 我有第二個對象, UpdatedPatient
,可能有不同的值。 目前,我正在為每個屬性使用以下內容:
if (exPt.Id!= pt.Id)
{
exPt.Id = pt.Id;
PatientChanged = true;
}
檢查PatientChanged
所有屬性后,如果PatientChanged
標志為true
,則更新患者。 是的,它有效,但我在質疑這是否是最有效的解決方案。
是的,它有效,但我在質疑這是否是最有效的解決方案。
就運行時效率而言,這可能是最有效的解決方案。
檢查完所有屬性后,如果PatientChanged標志為true,則更新患者
你可以加快速度 - 如果你選擇任何屬性並且PatientChanged
為true
,你知道你需要更新,所以你可以跳過其他檢查。
當然,您可以使用Reflection編寫一個方法來為您執行此檢查。 但是,這在性能方面效率要低得多,但它可能不必為所有類型編寫這些檢查,這可以提高開發人員的效率。
我在質疑這是否是最有效的解決方案。
答案取決於衡量效率的方式。
您可能希望構建一個混合LINQ / Reflection解決方案以獲得可接受的效率並保持可維護性:使用反射來獲取您需要比較的所有屬性,構建一個逐個比較它們的LINQ表達式樹,將其編譯為lambda,並使用結果函子進行CPU效率比較。
以下是混合方法的示例實現:
public static Func<T,T,bool> MakeComparator<T>() {
var lhs = Expression.Parameter(typeof (T));
var rhs = Expression.Parameter(typeof (T));
var allPropChecks = typeof(T)
.GetProperties()
.Where(p => p.CanRead && p.GetIndexParameters().Length == 0)
.Select(p => Expression.Equal(Expression.Property(lhs, p), Expression.Property(rhs, p)))
.ToList();
Expression compare;
if (allPropChecks.Count == 0) {
return (a,b) => true; // Objects with no properties are the same
} else {
compare = allPropChecks[0];
compare = allPropChecks
.Skip(1)
.Aggregate(compare, Expression.AndAlso);
}
return (Func<T, T, bool>)Expression.Lambda(compare, new[] { lhs, rhs }).Compile();
}
使用此方法,您可以執行以下比較:
class Point3D {
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
}
...
// Construct sample objects
var p1 = new Point3D { X = 1, Y = 2, Z = 3};
var p2 = new Point3D { X = 1, Y = 2, Z = 3 };
var p3 = new Point3D { X = 1, Y = 3, Z = 1 };
// Get a comparator
var cmp = MakeComparator<Point3D>();
// Use the comparator to compare objects to each other
Console.WriteLine(cmp(p1, p2));
Console.WriteLine(cmp(p2, p3));
以下是ideone上這種方法的演示 。
請注意,此實現相當簡單。 它對所有屬性使用==
,而不是在適當的時候使用Equals
。 您可以通過使第7行更復雜來擴展它。
如果你使exPt成為一個結構而不是一個類,那么它的.Equals方法會比較每個字段,而不是參考比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.