我有两个具有以下定义的对象:
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/