Array mit textlichen Index

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Sowas kann man implementieren. Stichwort: Indexer und dann den Parameter halt so festlegen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    jan99 schrieb:

    mit Indizies die aus Buchstaben dürfen
    Wenn Du nicht Dim Otto As Integer = 15 meinst, muss das "otto" in Apostrophen stehen, also ein String sein: MeinArray("Otto") = 47.
    Das geht, wie @slice sagt, bei einem Dictionary, und das sieht dann so aus:

    VB.NET-Quellcode

    1. Dim dct = New Dictionary(Of String, Integer)
    2. dct.Add("Otto", 13)
    3. MessageBox.Show(dct("Otto").ToString)
    4. dct("Otto") = 42
    5. MessageBox.Show(dct("Otto").ToString)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin !
    vielen Dank für Eure Informationen.

    Ich habe das jetzt einmal umgesetzt - bekomme aber im Editor einen Hinweis auf mögliche Laufzeitfehler wegen einer 'spät gebundenen Auflösung' !

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic
    2. Public Class frm_BearbeitenSiel_Digitalisieren
    3. Private _Old_Osmode As Integer
    4. Dim _Document As Autodesk.Map.IM.Forms.Document
    5. Dim _Properties As New EBL.Bearbeiten.Siel.Properties
    6. Dim _dctFeatures = New Dictionary(Of String, Integer)
    7. ....
    8. Private Sub frm_BearbeitenSiel_Digitalisieren_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. Dim _Old_Osmode As Integer = CInt(Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("OSMODE"))
    10. ' Befüllen der Listen
    11. InitTabx(0, lb_Schächte)
    12. InitTabx(1, lb_Elemente)
    13. Dim ListOfFeature() As String = _Properties.GetFeatureTabellen(200)
    14. For Each FeatureTabelle As String In ListOfFeature
    15. _dctFeatures.Add(FeatureTabelle, 0)
    16. Next


    Hätte ich das anders schreiben müssen oder ist diese Meldung zu vernachlässigen ?

    Gruß Jan

    jan99 schrieb:

    Laufzeitfehler
    in welcher Codezeile?
    Wozu brauchst Du Imports Microsoft.VisualBasic?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das mit dem Textbasiertem Index kannst du schön über Properties lösen. Ich hab da mal kurzt im Object-Brower nachgeschaut und hab da dann in Cotrol-Klasse die ControlCollection-Klasse gefunden. Die macht das ganze wie gesagt über Properties:
    Hier das ganze mal anhand von Car und CarCollection in VB.NET und C#
    VB.NET-Code

    VB.NET-Quellcode

    1. Imports System.Linq
    2. Imports System.Windows.Forms
    3. Imports System.Collections.Generic
    4. Module Module1
    5. Sub Main()
    6. End Sub
    7. Public Class Car
    8. Public Property Name As String
    9. Public Property Marke As String
    10. Public Property Person As Integer
    11. Public Overrides Function ToString() As String
    12. Return String.Format("[Name={0}, Marke={1}, Insassen={2}", Me.Name, Me.Marke, Me.Person)
    13. End Function
    14. End Class
    15. Public Class CarCollection
    16. Private carList As List(Of Car)
    17. Public Sub New()
    18. Me.carList = New List(Of Car)()
    19. End Sub
    20. Public Sub Add(c As Car)
    21. Me.carList.Add(c)
    22. End Sub
    23. Public Sub Remove(c As Car)
    24. Me.carList.Remove(c)
    25. End Sub
    26. Public Sub Remove(index As Integer)
    27. Me.carList.RemoveAt(index)
    28. End Sub
    29. Default Public Property Car(carName As String) As Car 'Default macht es Indexierbar
    30. Get
    31. Return Me.carList.Find(Function(x)
    32. Return x.Name = carName
    33. End Function)
    34. End Get
    35. Set(value As Car)
    36. Dim car = Me.carList.Find(Function(x)
    37. Return x.Name = carName
    38. End Function)
    39. Dim index = Me.carList.IndexOf(car)
    40. Me.carList(index) = value
    41. End Set
    42. End Property
    43. Default Public Property Car(index As Integer) As Car
    44. Get
    45. Return Me.carList(index)
    46. End Get
    47. Set(value As Car)
    48. Me.carList(index) = value
    49. End Set
    50. End Property
    51. End Class
    52. End Module

    C#-Code

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Windows.Forms;
    4. using System.Linq;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. namespace IndexerTest1
    8. {
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. CarCollection cl = new CarCollection();
    14. cl.add(new Car() { Name = "VW Diesel", Marke = "VW", Person = 5 });
    15. cl.add(new Car() { Name = "Ford Fiesta", Marke = "Ford", Person = 5 });
    16. cl.add(new Car() { Name = "Mercedes A-Klasse", Marke = "Mercedes", Person = 5 });
    17. cl.add(new Car() { Name = "Mini Cooper", Marke = "Mini", Person = 2 });
    18. cl.add(new Car() { Name = "Jeep Renegade", Marke = "Jeep", Person = 4 });
    19. cl.add(new Car() { Name = "Ferrair A380", Marke = "Ferrari", Person = 2 });
    20. cl.add(new Car() { Name = "Honda Civic", Marke = "Honda", Person = 6 });
    21. Car c1 = cl["VW Diesel"];
    22. Console.WriteLine(c1.ToString());
    23. Car c2 = cl[5];
    24. Console.WriteLine(c2.ToString());
    25. cl.Remove(c1);
    26. cl.Remove(cl[1]);
    27. cl.Remove(cl["Ferrari A380"]);
    28. Console.ReadKey();
    29. }
    30. }
    31. public class Car
    32. {
    33. public string Name { get; set; }
    34. public string Marke { get; set; }
    35. public int Person { get; set; }
    36. public override string ToString()
    37. {
    38. return string.Format("[Name={0}, Marke={1}, Insassen={2}]", this.Name, this.Marke, this.Person);
    39. }
    40. }
    41. public class CarCollection
    42. {
    43. private List<Car> carList;
    44. public CarCollection()
    45. {
    46. this.carList = new List<Car>();
    47. }
    48. public void add(Car c)
    49. {
    50. this.carList.Add(c);
    51. }
    52. public void Remove(Car c)
    53. {
    54. this.carList.Remove(c);
    55. }
    56. public void Remove(int index)
    57. {
    58. this.carList.RemoveAt(index);
    59. }
    60. public Car this[int index]
    61. {
    62. get
    63. {
    64. return this.carList[index];
    65. }
    66. set
    67. {
    68. this.carList[index] = value;
    69. }
    70. }
    71. public Car this[string carName]
    72. {
    73. get
    74. {
    75. return this.carList.Find((x) => x.Name == carName);
    76. }
    77. set
    78. {
    79. Car c = this.carList.Find((x) => x.Name == carName);
    80. int index = this.carList.IndexOf(c);
    81. this.carList[index] = value;
    82. }
    83. }
    84. }
    85. }


    Das ganze kann man dann auch noch schön mit <T> oder (Of T) generisch machen ;D

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Radinator“ ()

    Moin !

    habe das in allen Projekten (hoffentlich) umgestellt.

    Dafür steht jetzt in Zeile 30

    VB.NET-Quellcode

    1. _dctFeatures.Add(FeatureTabelle, 0)


    Die Anmerkung
    Fehler 36 "Option Strict On" lässt spätes Binden nicht zu. X:\VB_NET_2015\Projects\tappenbeckja\EBL.Bearbeiten.Siel\EBL.Bearbeiten.Siel\frm_BearbeitenSiel_Digitalisieren.vb 33 13 EBL.Bearbeiten.Siel


    Damit werden jetzt aber richtig Fehler gelistet - erkaufe ich mir damit nicht schlechteres ?

    Gruß Jan
    nein - verwechsel nicht Fehlermeldungen mit Fehlern.
    Die Fehlermeldungen sind deine Freunde.
    Ohne Fehlermeldungen kannst du die Fehler nicht beseitigen.



    Aber wie gesagt - du präsentierst uns iwie falschen Code.

    Denn solches habichjetzt ausprobiert:

    VB.NET-Quellcode

    1. Dim _dctFeatures As New Dictionary(Of String, Integer)
    2. Private Sub frm_BearbeitenSiel_Digitalisieren_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim ListOfFeature() As String '= _Properties.GetFeatureTabellen(200)
    4. For Each FeatureTabelle As String In ListOfFeature
    5. _dctFeatures.Add(FeatureTabelle, 0)
    6. Next
    7. End Sub
    und kompiliert
    Bingo - da gab es jetzt eine Fehlermeldung und damit war die zweite behoben!

    Woher wußtest Du ? Grinzzzz !

    Habe dann aber noch eine Frage in Zusammenhang mit der Optionsumstellung.



    VB.NET-Quellcode

    1. Public Function GetFeatureTabellen(ByVal MaxIdx As Integer) As Array
    2. Dim CollectionTabelleName As String = "|"
    3. Dim TabelleName As String
    4. For Idx As Integer = 1 To MaxIdx
    5. TabelleName = GetManholeTabelle(Idx)
    6. CollectionTabelleName = CheckFeatureTabellenName(TabelleName, CollectionTabelleName)
    7. TabelleName = GetCoverTabelle(Idx)
    8. CollectionTabelleName = CheckFeatureTabellenName(TabelleName, CollectionTabelleName)
    9. TabelleName = GetDivElementTabelle(Idx)
    10. CollectionTabelleName = CheckFeatureTabellenName(TabelleName, CollectionTabelleName)
    11. Next
    12. Dim ListOfTabellen() As String = CollectionTabelleName.Split({"|"}, StringSplitOptions.RemoveEmptyEntries)
    13. Return ListOfTabellen
    14. End Function


    Die Einbindung der Funktion, mit dem Array als Rückgabe, habe ich mir aber so aus dem Web gesucht. Föllig falsch ?



    gruß Jan
    naja, hat einer gecodet, der keine Ahnung von Datentypen hat.

    Die Methode ist mit Rückgabe-Datentyp Array deklariert (zeile #1), aber was tatsächlich mit der Return-Anweisung zurückgegeben wird - welchen Datentyp hat das? (zeile #17).

    Hilfestellung: Video-Tut: Welchen Datentyp hat das Objekt?

    Dann deklarirere den Rückgabewert richtig, also entsprechend dem, was auch tatsächlich returnt wird, und auf einmal wird alles gut.

    (Du merkst: Sobald du Strict On machst, fängst du an, Datentypen zu unterscheiden, was zuvor für dich nur ein einziger Brei war.)