Поиск объекта в общем списке

Можно ли искать объект по одному из его свойств в общем списке?

Public Class Customer

    Private _id As Integer

    Private _name As String

    Public Property ID() As Integer
        Get
            Return _id
        End Get
        Set
            _id = value
        End Set
    End Property

    Public Property Name() As String
        Get
            Return _name
        End Get
        Set
            _name = value
        End Set
    End Property

    Public Sub New(id As Integer, name As String)
        _id = id
        _name = name
    End Sub

End Class

Затем загрузка и поиск

Dim list as new list(Of Customer)

list.Add(New Customer(1,"A")

list.Add(New Customer(2,"B")

Как я могу вернуть объект клиента с идентификатором = 1? Имеет ли это отношение к «Предикату» в дженериках?

Примечание. Я делаю это в VB.NET.


person Saif Khan    schedule 14.10.2008    source источник


Ответы (4)


Да, это имеет прямое отношение к предикатам :)

Вам нужен метод Find(Of T). Вам нужно передать предикат (который в данном случае является типом делегата). То, как вы создаете этот делегат, зависит от используемой версии VB. Если вы используете VB9, вы можете использовать лямбда-выражение. (Если вы используете VB9, вы, возможно, захотите использовать LINQ вместо Find(Of T) в первую очередь, обратите внимание.) Форма лямбда-выражения будет примерно такой:

list.Find(function(c) c.ID = 1)

Я не уверен, поддерживает ли VB8 анонимные методы так же, как C# 2. Если вам нужно вызвать это из VB8, я посмотрю, что я могу придумать. (На самом деле я больше человек C# :)

person Jon Skeet    schedule 14.10.2008
comment
В этом проекте я использую VB9 On 2.0, а не 3.5 :( Я попробую лямбда-выражение. Спасибо! - person Saif Khan; 14.10.2008
comment
Если вы используете VB9, но ограничены .NET 2.0, вы можете посмотреть на LINQBridge: albahari .com/nutshell/linqbridge.aspx По сути, это реализация LINQ to Objects, ориентированная на .NET 2.0. - person Jon Skeet; 14.10.2008

Обычно вам нужно использовать предикаты:

list.Add(New Customer(1, "A"))
list.Add(New Customer(2, "B"))

Private Function HasID1(ByVal c As Customer) As Boolean
    Return (c.ID = 1)
End Function

Dim customerWithID1 As Customer = list.Find(AddressOf HasID1)

Или со встроенными методами:

Dim customerWithID1 As Customer = list.Find(Function(p) p.ID = 1)
person Ozgur Ozcitak    schedule 14.10.2008

Вы также можете перегрузить метод equals, а затем выполнить метод contains. как это

Dim list as new list(Of Customer)

list.Add(New Customer(1,"A")

list.Add(New Customer(2,"B")

list.contains(new customer(1,"A"))

тогда метод equals будет выглядеть так

public overrides function Equals(Obj as object) as Boolean
   return Me.Id.Equals(ctype(Obj,Customer).Id
end Function

Не тестировалось, но должно быть достаточно близко.

person chrissie1    schedule 14.10.2008