【问题标题】:Best way to compare 2 Data models in C# .NET Core在 C# .NET Core 中比较 2 个数据模型的最佳方法
【发布时间】:2022-11-04 18:57:52
【问题描述】:

我有 2 个具有相同属性的数据模型,我从 2 个 Web API 响应中获取数据。我正在尝试将 2 个模型与值进行比较,如果发现数据差异,我需要比较,如果发现分配给数据模型的新实例或现有的最新实例,则查找差异。

例如:UserProfile1 包含最新数据。

比较 2 个数据模型(不是列表)的最佳方法是什么?目前我正在使用 if-else 方法,因为我有 25 个属性用于单个数据模型。

Icomparer 可以吗?

UserProfile userProfile1 = new UserProfile()
{
    Name = "Satya",
    AddressLine1 = "RailwayRoad",
    AddressLine2 = "MG Street",
    AddressLine3 = "India"
    };

UserProfile userProfile2 = new UserProfile()
{
    Name = "Satya",
    AddressLine1 = "RailwayRoad",
    AddressLine2 = "Metro Street",
    AddressLine3 = "India"
};

if(userProfile1.Equals(userProfile2))
{
    // I tried like this 
}

bool isUserDetailsDiff = false;
if (!string.Equals(userProfile1.Name, userProfile2.Name))
{
    isUserDetailsDiff = true;
    userProfile1.Name = userProfile2.Name;
}
else if (!string.Equals(userProfile1.AddressLine1, userProfile2.AddressLine2))
{
    isUserDetailsDiff = true;
    userProfile1.AddressLine1 = userProfile2.AddressLine2;
}

【问题讨论】:

  • Data Model 是一个抽象术语,既不是容器,也不是可以与其他事物进行比较的对象。您在问如何对两者进行深度比较对象userProfile2userProfile1。有几个关于这个的问题。 like this one。虽然没有简单的解决方案。您要么使用反射来比较属性,要么使用IEquatable 和复杂属性的递归
  • 这个问题在这里得到解答:stackoverflow.com/a/10454552/8336973
  • 为什么将对象称为data models?您是否尝试将差异保存到数据库中?还是让 EF 以某种方式表现?将更改发送给客户端?
  • 还有record - 会生成IEquatable<T> 代码的语法糖

标签: c# .net .net-core datamodel iequalitycomparer


【解决方案1】:

您可以将 UserProfile 声明为记录,您可以通过执行此 userProfile1 == userProfile2 来比较它们

public record UserProfile(
string Name,
string AddressLine1,
string AddressLine2,
string AddressLine3
);

public class Example
{
    public void ExampleMethod()
    {
        var userProfile1 = new UserProfile("Satya", "RailwayRoad", "MG Street", "India");
        var userProfile2 = new UserProfile("Satya", "RailwayRoad", "MG Street", "India");

        if (userProfile1 == userProfile2)
        {
           //...
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多