gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:49:09 32 4
gpt4 key购买 nike

我有两个具有这些定义的对象:

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 对象中都有值(value);

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

第二个问题:如果我可以创建两个不同的 Products 副本,我就可以避免相等问题;我的意思是说我们有一个包含所有成员和值的基本 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/

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