Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义对象是否与列表的值相等<&燃气轮机;_C#_.net - Fatal编程技术网

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//>;这将确保在整个框架中使用比较逻辑,而无需任何额外的参与。如果没有明显的候选人,或者如果你想比较