Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Параметры элементов массива Добавлено: 14.01.11 05:05  

Автор вопроса:  Дмитрий
Здравствуйте. Подскажите, пожалуйста, как можно решить проблему. Есть, предположим, класс:

Public Class newClass
        Private strNickname As String
        Private intID As Integer

        Public Property Nickname() As String
            Get
                Return strNickname
            End Get
            Set(ByVal value As String)
                strNickname = Value
            End Set

        End Property

        Public Property ID() As Integer
            Get
                Return intID
            End Get
            Set(ByVal value As Integer)
                intID = Value
            End Set
        End Property

        Public Overrides Function ToString() As String
            Return strNickname
        End Function

    End Class


Есть несколько массивов такого вида:

For i = 0 To ubound(X)            
ReDim Preserve arrM(i)
            arrM(i) = New newClass
            arrM(i).ID = X.Param1
            arrM(i).Nickname = X.Param2      
Next i


Нужна функция, в которую будут передаваться название массива для поиска нужного элемента, параметр и значения параметра для поиска, нечто типа:

   
Public Function Select_Arr(ByVal strArr As Array, ByVal strParam As String, ByVal objKey As Integer) As String

        For i As Integer = LBound(strArr) To UBound(strArr)
            If strArr(i).strParam = objKey Then
                Select_Arr = i
                Exit Function
            End If
        Next
    End Function


Очевидно, что вот это вот
strArr(i).strParam
не работает. :) Как правильно передавать в функцию произвольные название массива и параметры элементов массива?

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 14.01.11 08:54
такая возможность, конечно, есть. но оно будет работать гораздо медленнее, поэтому, лучше напиши пару функций, которые будут осуществлять поиск каждая по своему параметру. В конечном счете у тебя ведь не 100 полей в классе и не по всем требуется поиск.
Далее, в дотнете массивами я так думаю, мало кто пользуется. Я так точно не помню, когда последний раз их юзал. Используй List.
  1. For i = 0 To ubound(X)            
  2. ReDim Preserve arrM(i)

Здесь ты на каждой итерации изменяешь размер массива, это большой удар по производительности.
Следует делать так:
  1. Dim arrM As New List(Of newClass)
  2. For i As Integer = 0 to x.Count 'x - тоже сделать List, ну или хотя бы x.Length, т.к. ubound(x) - это устаревшая конструкция vb6
  3.         Dim newElement As New newClass()
  4.         newElement.ID = x.Param1
  5.         newElement.Nickname = x.Param2
  6.         arrM.Add(newElement)
  7. Next


ну и если юзаешь дотнет >= 3.5, то проще уже юзать linq, тогда функция поиска по нику будет выглядеть всего лишь вот так:
  1. Public Function findByNickname(ByVal list As List(Of newClass), ByVal nick As String) As List(Of newClass)
  2.         Return list.Where(Function(el) el.Nickname = nick).ToList()
  3.     End Function
  4.  
  5. Dim l As List(Of newClass) = findByNickname(arrM, "we")

Ответить

Номер ответа: 2
Автор ответа:
 Дмитрий



Вопросов: 1
Ответов: 2
 Профиль | | #2 Добавлено: 14.01.11 12:01
Спасибо. Так действительно проще. Если не сложно — напиши все-таки, как реализовать возможность передавать в функцию любое название массива/параметра. Не для реализации, а для ликбеза - вдруг пригодится еще. Ну или просто скажи в каком направлении искать.

Ответить

Номер ответа: 3
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #3
Добавлено: 14.01.11 14:55
примерно так:
  1.  
  2. Public Class newClass
  3.         Private strNickname As String
  4.         Private intID As Integer
  5.  
  6.         Public Property Nickname() As String
  7.             Get
  8.                 Return strNickname
  9.             End Get
  10.             Set(ByVal value As String)
  11.                 strNickname = Value
  12.             End Set
  13.  
  14.         End Property
  15.  
  16.         Public Property ID() As Integer
  17.             Get
  18.                 Return intID
  19.             End Get
  20.             Set(ByVal value As Integer)
  21.                 intID = Value
  22.             End Set
  23.         End Property
  24.  
  25.         Public Overrides Function ToString() As String
  26.             Return strNickname
  27.         End Function
  28.  
  29.         Public Function CheckConditionByProperty(ByVal prop As String, ByVal cond As Object) As Boolean
  30.             Dim t As Type = Me.GetType()
  31.             Dim pi As PropertyInfo = t.GetProperty(prop)
  32.             If pi Is Nothing Then Throw New Exception("Свойство не найдено")
  33.             Dim val As Object = pi.GetValue(Me, Nothing)
  34.             Return val.Equals(cond)
  35.         End Function
  36.     End Class
  37.  
  38.         Dim arrM As New List(Of newClass)
  39.         Dim newElement As New newClass()
  40.         newElement.ID = 1
  41.         newElement.Nickname = "we"
  42.         arrM.Add(newElement)
  43.         Dim l As List(Of newClass) = arrM.Where(Function(el) el.CheckConditionByProperty("Nickname", "we")).ToList()

Ответить

Номер ответа: 4
Автор ответа:
 Дмитрий



Вопросов: 1
Ответов: 2
 Профиль | | #4 Добавлено: 14.01.11 15:09
Skywalker, Спасибо.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам