gpt4 book ai didi

c# - 如何检查对象内容相等性而不是对象引用相等性

转载 作者:太空宇宙 更新时间:2023-11-03 19:23:31 24 4
gpt4 key购买 nike

我有一个看起来像这样的 Entity Framework 实体:

class ListItemEtlObject
{
public int ID { get; set; }
public string ProjectName { get; set; }
public string ProjectType { get; set; }
public string ProjectCode { get; set; }
public string ProjectDescription { get; set; }
public string JobNo { get; set; }
public string JobDescription { get; set; }
public bool Include { get; set; }
}

我正在将来自两个不同数据源的项目提取到 IEnumerable 列表中。我如何在不使用一堆 if 语句的情况下比较项目来检查属性值之间是否存在差异,然后在它们不匹配时设置属性值?这个想法是保持列表同步。列表 A 也有一个 ID 值集,列表 B 没有。我只是觉得有比一堆更好的方法来做到这一点

if(objectA.ProjectName != objectB.ProjectName)
{
objectA.ProjectName = objectB.ProjectName;
}

最佳答案

如果您可以控制源对象,那么支持基于值的相等性的最佳声明方式是实现 IEquatable<T> .不幸的是,这确实需要您枚举所有这些检查,但它只在实际对象定义位置完成一次,不需要在整个代码库中重复。

class ListItemEtlObject : IEquatable<ListITemEtlObject>
{
...
public void Equals(ListITemEtlObject other) {
if (other == null) {
return false;
}
return
ID == other.ID &&
ProjectName == other.ProjectName &&
ProjectType == other.ProjectType &&
... ;
}
}

此外,您可以选择在对象类型上重载相等运算符,并允许消费者简单地使用 !===ListItemEtlObject实例并获得值相等而不是引用相等。

public static bool operator==(ListItemEtlObject left, ListItemEtlObject right) {
return EqualityComparer<ListItemEtlObject>.Default.Equals(left, right);
}
public static bool operator!=(ListItemEtlObject left, ListItemEtlObject right) {
return !(left == right);
}

关于c# - 如何检查对象内容相等性而不是对象引用相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10400366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com