c# - 基于字典比较两个对象的相等性

标签 c# object dictionary clone equality

我有两个具有以下定义的对象:

public static Dictionary<string, Container> cont1 = new Dictionary<string, Container>();
public static Dictionary<string, Container> cont2 = new Dictionary<string, Container>();

Container类的架构如下:

public class Container
{
    public string IDx { get; set; }
    public string IDy { get; set; }
    public string Name { get; set; }
    public Dictionary<string, Sub> Subs = new Dictionary<string, Sub>();
}

public class Sub
{
    public string Namex { get; set; }
    public string Namey { get; set; }
    public string Value { get; set; }
    public Dictionary<string, string> Paths { get; set; }
}

我的问题是:如何深度检查 cont1 和 cont2 的权益?我的意思是每个成员和值的平等,甚至在 Subs 对象的深处也是如此;

C# 中是否有针对这种情况的功能,或者我必须自己编写一个自定义方法来根据对象的结构检查相等性;

第二个问题:如果我可以创建两个不同的产品副本,我就可以避免相等问题;我的意思是说,我们有一个包含所有成员和值的基本 Container 对象,然后创建 Container 的两个单独的副本,即 cont1 和 cont2,更改 cont1 中的值不会更改 cont2 中的相同值。

注意1:此克隆方法不起作用:

cont2 = new Dictionary<string, Container>(cont1);

注2:其他答案中提出的大多数方法都是基于一级字典(使用循环或 LINQ 进行检查),而不是当我们有属性和字典对象(具有他们自己的属性)在对象内。

最佳答案

字典是一个序列,所以一般来说您可能正在寻找的是 Enumerable<T>.SequenceEquals 它允许传入 IEquityComparer<T> .

您的序列(字典)是 IEnumerable<KeyValuePair<string,Container>>所以你需要一个实现 IEquityComparer<IEnumerable<KeyValuePair<string,Container>>> 的比较器(有很多尖括号!)。

var equal = cont1.SequenceEquals(cont2, new StringContainerPairEquityComparer());

请注意,元素字典的顺序无法保证,因此要正确使用该方法,您可能应该使用 OrderBy在比较序列之前 - 但这会增加该方法的低效率。


对于你的第二个问题,你想要做的是克隆字典。一般来说你的Container应该实现ICloneable界面,然后您可以使用它来创建副本

var cont2 = cont1.ToDictionary(k => k.Key, v => v.Value.Clone());

关于c# - 基于字典比较两个对象的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37180810/

相关文章:

javascript - 通过 JSON 文件创建大型客户端 Javascript 对象数组的替代方案?

ios - 如何在 Swift 中将字典值数组打印成漂亮的字符串

c# - TextWriterTraceListener 跟踪文件太大

c# - 查找 CultureInfo 的资源

C# 在Windows打印机管理中删除打印机端口

java - 查找对象引用

c# - 为特定的 GDI 设备上下文禁用抗锯齿

c# - 尝试在 C# 中调用在 ArrayList 中索引的对象的方法

Scala:从 Seq 到 Sequential Futures

javascript - 根据内部条件以编程方式修改 map