Можно ли искать объект по одному из его свойств в универсальном списке?
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")
Как я могу вернуть объект клиента с id = 1? Связано ли это с «предикатом» в Generics?
Примечание: я делаю это в VB.NET.





Если вы используете .NET 3.5, это можно сделать с помощью LINQ to Objects:
Как: запросить список ArrayList с помощью LINQ
Если нет, в .NET 2.0 вы можете использовать Find метод списка.
Идея состоит в том, что вам нужно будет предоставить метод, возвращающий истину, если свойство вашего объекта удовлетворяет определенному условию.
Да, это связано с предикатами :)
Вам нужен метод Найти (Of T). Вам нужно передать предикат (который в данном случае является типом делегата). То, как вы создаете этот делегат, зависит от того, какую версию VB вы используете. Если вы используете VB9, вы можете использовать лямбда-выражение. (Имейте в виду, что если вы используете VB9, вы можете в первую очередь использовать LINQ вместо Find (Of T).) Форма лямбда-выражения будет выглядеть примерно так:
list.Find(function(c) c.ID = 1)
Я не уверен, поддерживает ли VB8 анонимные методы так же, как это делает C# 2. Если вам нужно вызвать из VB8, я посмотрю, что я могу придумать. (На самом деле я больше люблю C# :)
Если вы используете VB9, но ограничены .NET 2.0, вы можете посмотреть LINQBridge: albahari.com/nutshell/linqbridge.aspx Это в основном реализация LINQ to Objects, ориентированная на .NET 2.0.
Обычно вам нужно использовать предикаты:
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)
Вы также можете перегрузить метод 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
Не проверено, но должно быть достаточно близко.
В этом проекте я использую VB9 в версии 2.0, а не в версии 3.5 :( Я попробую лямбда-выражение. Спасибо!