【发布时间】:2016-05-04 20:33:19
【问题描述】:
如何检查两个对象列表是否相同?我有具有相同结构的列表 A 和列表 B:
[XmlRoot(ElementName = "Details")]
public class Details
{
[XmlElement(ElementName = "time")]
public string time { get; set; }
[XmlElement(ElementName = "duration")]
public string duration { get; set; }
}
[XmlRoot(ElementName = "Remark")]
public class Remark
{
[XmlElement(ElementName = "RemarkText")]
public string RemarkText { get; set; }
[XmlElement(ElementName = "isRemarkVisible")]
public Boolean IsRemarkVisible { get; set; }
}
[XmlRoot(ElementName = "test")]
public class test
{
[XmlElement(ElementName = "ID")]
public string ID { get; set; }
[XmlElement(ElementName = "Name")]
public string Name { get; set; }
public Details Details { get; set; }
[XmlElement(ElementName = "Remark")]
public Remark Remark { get; set; }
}
[XmlRoot(ElementName = "Tests")]
public class Tests
{
[XmlElement(ElementName = "test")]
public test[] test { get; set; }
}
我使用 linq 将其转换为列表。
列表 A:
Test
id=1
name=abc
details
starttime=9.00
endtime=12.00
duration=1hr
Remark
RemarkText= remark1
IsRemarkVisible=true
列表 B:
Test
id=1
name=abc
details
starttime=9.00
endtime=12.00
duration=1hr
Remark
RemarkText= remark2
IsRemarkVisible=true
这两个列表不相同(remarkText 字段)。我想要一段代码来比较这两个列表并返回是否相同。我该怎么做?
我尝试使用List1.Except(List2),但无法比较。
编辑
我创建了自定义 IEqualityComparer:
public class Compare : IEqualityComparer<test>
{
public bool Equals(test x, test y)
{
if (x == null || y == null) return false;
bool equals = x.ID == y.ID && x.Name == y.Name && x.Remark == y.Remark
&& x.Details == y.Details;
return equals;
}
public int GetHashCode(test codeh)
{
return (codeh.ID + codeh.Name + codeh.Remark + codeh.Details).GetHashCode();
}
}
还有
var Comparer = new Compare();
List1.Except(List2, Comparer)这应该行吗?
编辑
[XmlRoot(ElementName = "Details")]
public class Details
{
[XmlElement(ElementName = "starttime")]
public string starttime { get; set; }
[XmlElement(ElementName = "endtime")]
public string endtime { get; set; }
[XmlElement(ElementName = "duration")]
public string duration { get; set; }
}
[XmlRoot(ElementName = "Remark")]
public class Remark
{
[XmlElement(ElementName = "RemarkText")]
public string RemarkText { get; set; }
[XmlElement(ElementName = "isRemarkVisible")]
public Boolean IsRemarkVisible { get; set; }
}
[XmlRoot(ElementName = "test")]
public class test
{
[XmlElement(ElementName = "ID")]
public string ID { get; set; }
[XmlElement(ElementName = "Name")]
public string Name { get; set; }
public Details Details { get; set; }
[XmlElement(ElementName = "Remark")]
public Remark Remark { get; set; }
[XmlElement(ElementName = "Tags")]
public Tags Tags { get; set; }
}
[XmlRoot(ElementName = "Tags")]
public class Tags
{
[XmlElement(ElementName = "TagLocation")]
public TagLocation[] TagLocation { get; set; }
}
[XmlRoot(ElementName = "TagLocation")]
public class TagLocation
{
[XmlElement(ElementName = "Id")]
public string Id { get; set; }
[XmlElement(ElementName = "TagText")]
public string TagText { get; set; }
}
[XmlRoot(ElementName = "Tests")]
public class Tests
{
[XmlElement(ElementName = "test")]
public test[] test { get; set; }
}
【问题讨论】:
-
两个对象何时相等?通常实现自定义
IEqualityComparer<YourType>并将其传递给Except。 -
如果两个对象具有相同的数据。在我的示例中,如果列表 B 有 remarkText= remark1
-
@TimSchmelter 请您提供一个如何完成的示例。
-
创建一个实例并传递:
List1.Except(List2, yourComparer)