gpt4 book ai didi

arrays - vb.net独特的结构数组

转载 作者:行者123 更新时间:2023-12-02 09:48:18 26 4
gpt4 key购买 nike

我有一个结构

Public Structure MyRecords
Dim record_name As String
Dim record_surname As String
End Structure

和结构体数组

Dim Records_arr(100000) AS MyRecords

数组已充满数据,但我希望删除重复的 MyRecords

重复的意思:

Records_arr(3).record_name = "John"
Records_arr(3).record_surname = "Doe"

Records_arr(99).record_name = "John"
Records_arr(99).record_surname = "Doe"

在此示例中,我希望删除 Records_arr(3)Records_arr(99),或者仅清空其中之一的值。

我已经实现了从上到下然后从下到上的 2 遍扫描,以消除重复项,但速度非常慢。一定有更好的方法吗?

最佳答案

实现IEquatable<T>在您的结构上,然后使用 LINQ 的 Distinct()功能来实现您的目标。

这是一个示例实现:

Public Structure MyRecords
Implements IEquatable(Of MyRecords)

Dim record_name As String
Dim record_surname As String

Public Function Equals1(other As MyRecords) As Boolean Implements IEquatable(Of MyRecords).Equals
Return record_name.Equals(other.record_name) AndAlso record_surname.Equals(other.record_surname)
End Function
End Structure

现在您可以调用Records_arr.Distinct()它将返回数组的唯一记录。

进一步说明

针对您的评论,以下是发生的情况。由于您使用的是 Structure而不是Class , MyRecords已经继承ValueType.Equals()方法。对于不包含任何引用类型成员的值类型,Equals()方法对内存中的两个对象进行逐字节比较。另一方面,如果它确实包含引用类型成员(这是您的情况),它会使用反射来比较两个实例的相应字段。您有两个String结构中的字段,它们是引用类型,因此通过反射进行比较。 (重要的是要注意,String 类虽然是引用类型,但会覆盖 Equals() 以提供值比较而不是默认的引用比较)。因此,即使您不实现 IEquatableIComparable在你的类(class),Distinct()使用默认 ValueType.Equals() 可以正常工作功能。

但请注意,MSDN 要求您提供 Equals()此类结构的实现。以下是相关摘录:

特别是如果您的值类型包含引用类型的字段,您应该重写 Equals(Object) 方法。这可以提高性能并使您能够更准确地表示类型的相等含义。

您可以在this MSDN article中阅读更多相关信息。 .

关于arrays - vb.net独特的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25664789/

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