如果列表(Of T)如果它包含一个项目,但忽略一个属性是否不同?

时间:2014-08-08 19:32:58

标签: vb.net contains

所以我有一个名为alarm的结构,以及一个名为alarmList的警报列表。我经历一个循环,看看是否有新的警报。如果警报列表已经有,我说忽略它并继续:

Dim alarms() = G4TAPIs.G4TGetActivity(MyActRequest)  'get updated list of alarms
'this list may include all of the alarms previously. 

For Each alarm In alarms
    'if acknowledged, don't show
    If alarm.AckedFlag = True And alarm.ResetFlag = True Then   
        Continue For
    End If

    If alarmList.Contains(alarm) Then
        Continue For
    End If

    'do stuff to process

    alarmList.add(alarm)  'add new alarm
Next

这个家伙经常打电话。警报()更新了所有过去的警报,包括我已经处理的警报,但它将时间更新为当前时间,尽管它们已经发生。所以我检查他们是否已经在我的列表中处理了包含。

是否有一种方法(也欢迎使用linq方法!)来编辑包含条件,以便在它不同时忽略一个功能?特别是alarm.when(日期类型变量)。它更新到当前日期,我想确保包含列表检查它们是否在所有实例中都相等但是.when。

最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

创建一个IEqualityComparer,忽略您不想检查的属性,并使用接受该值的重载Contains和IEqualityComparer。

抱歉 - 这是c#,而不是VB ......我很少写VB,如果我尝试过 - 那可能会非常难看。

class AlarmEqualityComparer : IEqualityComparer<Alarm>
{
    public bool Equals(Alarm a1, Alarm a2)
    {
        // check whatever properties you want
    }

    public int GetHashCode(Alarm a1)
    {
        // build a hashcode using the properties that are checked
    }
}

编辑...添加了VB翻译。

Class AlarmEqualityComparer
    Implements IEqualityComparer(Of Alarm)

    Public Function Equals(a1 As Alarm, a2 As Alarm) As Boolean
        ' Check whatever properties you want
    End Function

    Public Function GetHashCode(a1 As Alarm) As Integer
        ' Build a hashcode using the properties that are checked
    End Function
End Class