检查同一类的两个实例在C#中是否具有相同的数据



我正在尝试验证我的两个对象是否具有相同的值。

这是我的

public class myclass
{
public List<c1> List1{ get; set; }
public List<c2> List2{ get; set; }
public List<c3> List3{ get; set; }
}
public class c1
{
public int Number{ get; set; }
public string Name{ get; set; }
public bool IsAvailable{ get; set; }
}
public class c2
{
public int Id{ get; set; }
public string Text{ get; set; }
public GUID Guid{ get; set; }
}
public class c3
{
public int? Age{ get; set; }
public string Role{ get; set; }
public bool IsDeleted{ get; set; }
}

我有两个这个类的实例,我想比较这两个实例之间的数据,并检查它们是否相同。

我尝试过序列化这两个对象并进行比较,但这不起作用,因为列表中的项目可能有不同的顺序。

我还尝试过获取各个列表的HashSet,并检查它们是否相等。

var s1 = new HashSet<c1>(list1);
var s2= new HashSet<c1>(list2);
return s1.SetEquals(s2);

一种解决方案是首先使用标准顺序对列表进行排序,如根据类型的数字或字母,然后尝试类似的方法

if (myclassInstance1.list1.SequenceEqual(myclassInstance2.list1))
{
//Repeat the cycle 2 more times and then //your code
}

由于这个可以比较序列,所以你需要首先排序列表,为此你可以使用这个

编辑:这是列表的文档。sequenceEquals((方法

最好的方法是使用中的IEqualityComparer显式实现模型。NET。

using System;
using System.Collections.Generic;

public class Program
{
public class MyClass
{
public List<C1> C1List { get; set; }
public List<C2> C2List { get; set; }
}

public class C1 : IEqualityComparer<C1>
{
public string FirstName { get; set; }
public string LastName { get; set; }

public bool Equals(C1 x, C1 y)
{
if(string.Equals(x.FirstName, y.FirstName, StringComparison.OrdinalIgnoreCase)
&& string.Equals(x.LastName, y.LastName, StringComparison.OrdinalIgnoreCase)) 
return true;
return false;
}
public int GetHashCode(C1 c)
{
return c.FirstName.Length * c.LastName.Length;
}
}

public class C2 : IEqualityComparer<C2>
{
public string FirstName { get; set; }
public string LastName { get; set; }

public bool Equals(C2 x, C2 y)
{
if(string.Equals(x.FirstName, y.FirstName, StringComparison.OrdinalIgnoreCase)
&& string.Equals(x.LastName, y.LastName, StringComparison.OrdinalIgnoreCase)) 
return true;
return false;
}
public int GetHashCode(C2 c)
{
return c.FirstName.Length * c.LastName.Length;
}
}
}

IEqualityComparer将为您提供">您调用两个相等对象所基于的参数";。

至于上面的实现,我认为如果FirstName和LastName相同,那么这两个对象是相等的。

尝试排序列表,然后比较其中的数据:

List<c1> l1 = list1.OrderBy(c => c.Number).ToList();
List<c1> l2 = list2.OrderBy(c => c.Number).ToList();
bool equalValue = true;
if (l1.Count() == l2.Count()) {
for (int i = 0; i < l1.Count(); i++){
if (l1[i].IsAvailable != l2[i].IsAvailable || l1[i].Number != l2[i].Number || l1[i].Name != l2[i].Name)
{
equalValue = false;
break;
}
}
}
else {
equalValue = false;
}
return equalValue;

最新更新