2016-12-21 2 views
0

Я пытаюсь сделать приложение, в этом приложении у меня есть коллекция List(of T), которая содержит объект.Как получить индекс объекта в коллекции

При обработке объекта мне нужно знать его индекс из списка.

Пример:

Public Class 

    Public oList as New List(of TestObject) 
    Private Sub Test() 


     Dim NewObject As New TestObject 
     oList.add(NewObject) 

     Index(NewObject) 

    End Sub 

    Private Sub Index(Byval TestObject As TestObject) 

     debug.print(Testobject.index) 

    End Sub 
End Class 

ли что-то подобное возможно? Я видел его в справочном файле, который я использовал некоторое время назад, но теперь я хотел бы сделать это доступным в моем собственном классе.

Может ли кто-нибудь предоставить образец?

PS: Я знаю, что могу получить индекс, используя List(Of T).IndexOf Method (T), но для будущих возможностей я хотел бы сделать вызов от самого объекта.

+0

Итак, если тип является то, то вы хотите, чтобы компонент тела был за ним, а также за следующий? А также вам нужен их индекс/позиция в списке? – Codexer

+0

Я просто хочу получить индекс текущего 'BodyComponent' в описанной здесь рутине, это может показаться бессмысленным, но в некоторых других случаях это может быть полезно. Чтобы получить один за другим и наоборот, я могу просто сделать индекс +1 или -1. –

+0

Измените свой цикл на индексный ... Например: «Для i As Integer = 0 To BodyComponents.Count» теперь у вас есть индекс, который вы можете использовать ... Например, 'BodyComponents (i)' будет возвращать этот объект при этом index, +1 даст вам один вперед, если есть один и -1, чтобы получить вас позади, если есть ... – Codexer

ответ

1

Что обычно происходит, так это то, что у них есть собственный список, они не используют непосредственно List (Of T) и сохраняют список внутри объекта, когда они добавляют этот элемент в список.

Module Module1 

    Sub Main() 

     Dim someList As New CustomList 
     someList.Add(New CustomItem()) 
     someList.Add(New CustomItem()) 
     someList.Add(New CustomItem()) 

     Console.WriteLine(someList(1).Index) 
     Console.ReadLine() 

    End Sub 

End Module 

Class CustomItem 

    ' Friend since we don't want anyone else to see/change it. 
    Friend IncludedInList As CustomList 

    Public ReadOnly Property Index 
     Get 
      If IncludedInList Is Nothing Then 
       Return -1 
      End If 

      Return IncludedInList.IndexOf(Me) 
     End Get 
    End Property 

End Class 

Class CustomList 
    Inherits System.Collections.ObjectModel.Collection(Of CustomItem) 

    Protected Overrides Sub InsertItem(index As Integer, item As CustomItem) 
     If item.IncludedInList IsNot Nothing Then 
      Throw New ArgumentException("Item already in a list") 
     End If 

     item.IncludedInList = Me 
     MyBase.InsertItem(index, item) 
    End Sub 

    Protected Overrides Sub RemoveItem(index As Integer) 
     Me(index).IncludedInList = Nothing 
     MyBase.RemoveItem(index) 
    End Sub 

End Class 
+0

Спасибо, может быть, мой вопрос был не совсем ясен, потому что я не знал, что вы можете создать собственную коллекцию. Если бы я использовал эту коллекцию, это также было бы хорошо с точки зрения использования памяти? Я имею в виду, что у моей пользовательской коллекции не было бы так много вариантов и, следовательно, легче? –

+0

@Mech_Engineer опциями, если вы имеете в виду методы, которые не имеют ничего общего с памятью. Использование Collection (Of T) или List (Of T) не окажет большого влияния на память. [Количество свойств/переменных внутри класса предметов] * [количество элементов в коллекции] будет. –

1

Похоже, что этот

Public oList As New List(Of TestObject) 
Private Sub Test() 

    Dim NewObject As New TestObject(oList.Count) 
    oList.add(NewObject) 

End Sub 

Public Class TestObject 
    Public index As Integer 

    Public Sub New(IndxOfObj As Integer) 
     Me.index = IndxOfObj 
    End Sub 
End Class 
+0

Хорошо, и что делать, если я должен сортировать свой список? (просто голый со мной, я новичок в этом) –

+0

Тогда сортировка должна будет пересчитать индексы. – dbasnett

0

Если вам обязательно нужно иметь его как свойство на объекте я хотел бы предложить следующее:

Public Class Main 
    Public oList As New List(Of TestObject) 
    Public Sub New() 

    ' This call is required by the designer. 
    InitializeComponent() 

    ' Add any initialization after the InitializeComponent() call. 

    Dim NewObject As New TestObject(Me) 
    oList.Add(NewObject) 
    Dim NewObject2 As New TestObject(Me) 
    oList.Add(NewObject2) 

    MsgBox(NewObject2.Index) 
    End Sub 

    Public Function Index(ByVal TestObject As TestObject) As Integer 
    Return oList.IndexOf(TestObject) 
    End Function 
End Class 

Public Class TestObject 

    Private _main As Main 
    Public ReadOnly Property Index() As Integer 
    Get 
     Return _main.Index(Me) 
    End Get 
    End Property 

    Public Sub New(RootClass As Main) 
    _main = RootClass 
    End Sub 

End Class 

Если вам посчастливилось иметь главный класс, как Синглтон вы можете пропустить всю отправку «Я» в бизнес-конструктор. Затем вы можете просто вызвать Main.Index, не сохраняя его как свойство во всех тестовых объектах.

 Смежные вопросы

  • Нет связанных вопросов^_^