VB.NET独特的结构数组

3

I have a structure

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
关闭投票?你是认真的吗? - Sharky
1个回答

4

在您的结构上实现 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()以提供值比较而不是默认的引用比较)。因此,即使你没有在类上实现IEquatableIComparableDistinct()函数也会使用默认的ValueType.Equals()函数正常工作。
但是请注意,MSDN要求你为这种类型的结构提供Equals()实现。以下是相关摘录:
“特别是如果您的值类型包含引用类型字段,则应重写Equals(Object)方法。这可以提高性能并使您更接近类型的相等含义。”
你可以在此MSDN文章中阅读更多内容。

为什么不在else后面直接返回false呢?我有什么遗漏吗?哦,等等,它会返回一个集合吗? - Sharky
这是 IComparable,而不是 IEquatable。返回类型是整数。IComparable 更优秀的地方在于它可以被 Distinct()OrderBy() 使用,因为 CompareTo() 可以用来对对象进行排序,因为它返回 -1、0 或 1 作为结果,而不仅仅是 True/False - dotNET
@Sharky:刚刚验证了一下,Distinct() 只能与 IEquatable 一起使用,而不能与 IComparable 一起使用。我已相应地编辑了我的答案。 - dotNET
没事了,我忘记加上.toArray了,这太尴尬了 >.< - Sharky
1
你在说哪一行?通常不需要使用“Me”来限定本地成员,所以你可以输入“SomeMember”而不是“Me.SomeMember”。 - dotNET
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接