簡體   English   中英

如何比較兩個對象的屬性?

[英]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,則更新患者

你可以加快速度 - 如果你選擇任何屬性並且PatientChangedtrue ,你知道你需要更新,所以你可以跳過其他檢查。

當然,您可以使用Reflection編寫一個方法來為您執行此檢查。 但是,這在性能方面效率要低得多,但它可能不必為所有類型編寫這些檢查,這可以提高開發人員的效率。

我在質疑這是否是最有效的解決方案。

答案取決於衡量效率的方式。

  • 就CPU周期而言,這是最有效的方式
  • 在維護工作方面,基於反射的方法將證明更有效。

您可能希望構建一個混合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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM