gpt4 book ai didi

c# - 自定义对象的值是否与 List<> 相等

转载 作者:行者123 更新时间:2023-11-30 21:02:20 30 4
gpt4 key购买 nike

我有以下类(class):

 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 实例,它在 List<Document> registeredDocument 中有多个文档.我得到一个新的 List<Document>来自用户。

如何验证列表中不存在新对象?我想按值(value)而不是引用进行比较。

我正在考虑使用 HashSet 而不是 List。这是正确的方法吗?

最佳答案

如何进行相等比较?

每当 BCL 类想要在某种类型的对象之间执行相等性检查时 T ,他们通过在 IEqualityComparer<T> 的某些实现中调用一个或两个方法来实现这一点.为了掌握这样的实现,该框架寻找 EqualityComparer<T>.Default .

如文档中所述,此属性会生成一个 IEqualityComparer<T>像这样:

The Default property checks whether type T implements the System.IEquatable<T> interface and, if so, returns an EqualityComparer<T> that uses that implementation. Otherwise, it returns an EqualityComparer<T> that uses the overrides of Object.Equals and Object.GetHashCode provided by T.

我有哪些选择?

因此,一般来说,要指定应该如何执行相等比较,您可以:

  1. 明确提供 IEqualityComparer<T> 的实现到执行相等性检查的类或方法。 List<T> 这个选项不是很明显, 但许多 LINQ 方法(例如 Contains )确实支持它。
  2. 让你的类(class)实现IEquatable<T> .这将使 EqualityComparer<T>.Default使用此实现,只要有明显的“自然”方式来比较 T 类型的对象,它就是一个不错的选择.
  3. 覆盖 object.GetHashCodeobject.Equals没有实现 IEqualityComparer<T> .但是,这只是 #2 的劣质版本,应始终避免使用 AFAIK。

选择哪个选项?

一个好的经验法则是:如果有一个明显和自然的方法来比较 T 类的对象, 考虑让它实现 IEquatable<T> ;这将确保您的比较逻辑在整个框架中使用,而无需任何额外的参与。如果没有明显的候选者,或者如果您想以不同于默认方式的方式进行比较,请实现您自己的 IEqualityComparer<T>并将实现作为参数传递给需要执行相等性检查的类或方法。

关于c# - 自定义对象的值是否与 List<> 相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13571424/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com