C# 自定义对象是否与列表的值相等<&燃气轮机;
我有以下课程:C# 自定义对象是否与列表的值相等<&燃气轮机;,c#,.net,C#,.net,我有以下课程: public class MyDocuments { public DateTime registeredDate; public string version; public List<Document> registeredDocuments; } public class Document { public string name; public
public class MyDocuments
{
public DateTime registeredDate;
public string version;
public List<Document> registeredDocuments;
}
public class Document
{
public string name;
public List<File> registeredFiles;
}
public class File
{
public string name;
public string content;
}
公共类MyDocuments
{
公共日期时间注册数据;
公共字符串版本;
公开名单登记文件;
}
公共类文档
{
公共字符串名称;
公开名单登记文件;
}
公共类文件
{
公共字符串名称;
公共字符串内容;
}
我有一个MyDocuments的实例,它在列表注册表文档中有多个文档。我从用户那里得到一个新的列表
如何验证列表中不存在新对象?我想通过价值而不是参考来比较
我正在考虑使用HashSet而不是List。这是正确的方法吗?覆盖该方法
下面是一个直接来自文档的示例
public class Person
{
private string idNumber;
private string personName;
public Person(string name, string id)
{
this.personName = name;
this.idNumber = id;
}
public override bool Equals(Object obj)
{
Person personObj = obj as Person;
if (personObj == null)
return false;
else
return idNumber.Equals(personObj.idNumber);
}
public override int GetHashCode()
{
return this.idNumber.GetHashCode();
}
}
Equals
方法返回一个bool,即obj
是否等于此
覆盖该方法
下面是一个直接来自文档的示例
public class Person
{
private string idNumber;
private string personName;
public Person(string name, string id)
{
this.personName = name;
this.idNumber = id;
}
public override bool Equals(Object obj)
{
Person personObj = obj as Person;
if (personObj == null)
return false;
else
return idNumber.Equals(personObj.idNumber);
}
public override int GetHashCode()
{
return this.idNumber.GetHashCode();
}
}
Equals
方法返回一个bool,即obj
是否等于此
您将需要实现Equals()
方法,可能还需要实现GetHashCode()
。请参见示例。您将需要实现Equals()
方法,可能还需要实现GetHashCode()
。请参阅以获取示例。您应该实现
在自定义对象上实现此接口时,所有相等性检查(如Contains、IndexOf)都会使用对象实现自动完成。您应该实现
在自定义对象上实现此接口时,所有相等检查(如Contains、IndexOf)都会使用对象实现自动完成。如何执行相等比较?
每当BCL类想要在某些类型的对象之间执行相等性检查时,它们都会通过调用的某些实现中的一个或两个方法来执行。为了获得这样一个实现,该框架希望
如文档中所述,此属性生成一个IEqualityComparer
,如下所示:
Default属性检查类型T是否实现
System.IEquatable
接口,如果是,则返回
使用该实现的EqualityComparer
。否则,
返回一个使用
Object.Equals
和Object.GetHashCode
由T
提供
我有什么选择?
因此,一般来说,要说明如何进行平等性比较,您可以:
显式地为执行相等性检查的类或方法提供IEqualityComparer
的实现。此选项在列表中不太可见,但许多LINQ方法(如)都支持此选项
使您的类实现IEquatable
。这将使EqualityComparer.Default
使用此实现,并且在有明显的“自然”方式来比较T
类型的对象时,这是一个很好的选择
重写object.GetHashCode
和object.Equals
,而不实现IEqualityComparer
。然而,这只是#2的一个低级版本,因此应始终避免使用AFAIK
选择哪个选项?
一个好的经验法则是:如果有一种比较自然的方法来比较类<代码> t>代码>的对象,考虑它的实现<代码> IEQuabtI//>;这将确保在整个框架中使用比较逻辑,而无需任何额外的参与。如果没有明显的候选项,或者如果希望以不同于默认值的方式进行比较,请实现自己的
IEqualityComparer
,并将实现作为参数传递给需要执行相等性检查的类或方法。如何执行相等性比较?
每当BCL类想要在某些类型的对象之间执行相等性检查时,它们都会通过调用的某些实现中的一个或两个方法来执行。为了获得这样一个实现,该框架希望
如文档中所述,此属性生成一个IEqualityComparer
,如下所示:
Default属性检查类型T是否实现
System.IEquatable
接口,如果是,则返回
使用该实现的EqualityComparer
。否则,
返回一个使用
Object.Equals
和Object.GetHashCode
由T
提供
我有什么选择?
因此,一般来说,要说明如何进行平等性比较,您可以:
显式地为执行相等性检查的类或方法提供IEqualityComparer
的实现。此选项在列表中不太可见,但许多LINQ方法(如)都支持此选项
使您的类实现IEquatable
。这将使EqualityComparer.Default
使用此实现,并且在有明显的“自然”方式来比较T
类型的对象时,这是一个很好的选择
重写object.GetHashCode
和object.Equals
,而不实现IEqualityComparer
。然而,这只是#2的一个低级版本,因此应始终避免使用AFAIK
选择哪个选项?
一个好的经验法则是:如果有一种比较自然的方法来比较类<代码> t>代码>的对象,考虑它的实现<代码> IEQuabtI//>;这将确保在整个框架中使用比较逻辑,而无需任何额外的参与。如果没有明显的候选人,或者如果你想比较