Daten auswerten

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Daten auswerten

    Morgen,

    Geht das irgendwie schnell und einfach wenn ich folgende Daten habe
    (Zum beispiel

    Spoiler anzeigen
    Datensatz 1: 500, 200
    Datensatz 2: 800, 830
    Datensatz 3: 550, 350
    Datensatz 4: 750, 900
    Datensatz 5: 680, 210

    Vergleichs Datensatz 1: 540, 356
    )

    herauszufinden, welcher Datensatz am nächsten am Vergleichs Datensatz 1 drann ist.

    Wäre geil wenn jemand zufällig die Frage mit meiner 'Erklärung' versteht und ne Lösung hätte.

    MfG
    Michi
    Schneller, nicht durchdachter Ansatz, für den's sicherlich ne viel einfachere Methode gibt:

    Du legst dir für jeden Datensatz 2 Dictionarys vom Typ Integer,Integer an. Key, ist natürlich die Datensatznummer, Value ist dein Wert. Die packste dann getrennt in wert1 und wert 2 in zwei Listen ein. Nu gehst du durch die Liste mit den ersten Datensatzwerten, und subtrahierst davon den ersten Wert des Vergleichsdatensatzes. Das Ergebnis speicherst du unter Anwendung von Math.Abs in einer separaten Liste, als Dictionary ab. Key ist natürlich der Key aus dem Dictionary, dass du gerade vergleichst. Das selbe machste auch mit der Liste der zweiten Werte der Datensätze. Nu hast du zwei Listen, die dir sagen, wie weit Weg die einzelnen Datensatzwerte von dem Vergleichswert sind.
    Viel spaß damit.
    Musst Du auch selbst die Datensätze aus dem String parsen? Gibt es eine Modell für die Datensätze? (Also damit meine ich Klassen, die die Datensätze darstellen.)

    Für das "am nähesten dran" könntest Du Pythagoras verwenden. Pseudocode:

    VB.NET-Quellcode

    1. Dim Closest As Datensatz
    2. Dim ClosestDistance = Double.MaxValue
    3. For Each i In Datensätze
    4. Dim CurrentDistance = (i.Wert1 - Referenzdatensatz.Wert1) ^ 2 + (i.Wert2 - Referenzdatensatz.Wert2) ^ 2
    5. If CurrentDistance < ClosestDistance Then
    6. ClosestDistance = CurrentDistance
    7. Closest = i
    8. End If
    9. Next

    Die Wurzel zu ziehen entfällt übrigens, weil nur verglichen wird.
    Wenn a > b, dann gilt automatisch sqrt(a) > sqrt(b) (für a, b >= 0)

    Edit: Der Pseudocode soll nur darstellen, wie das arbeitet. Man kann eine Liste von Datensätzen ganz einfach sortieren:

    VB.NET-Quellcode

    1. Dim Datensätze As IEnumerable(Of Datensatz) 'Damit klar ist, worüber wir reden.
    2. 'Nur den nähesten Datensatz:
    3. Dim Closest = Datensätze.Min(Function(i) (i.Wert1 - Referenzdatensatz.Wert1) ^ 2 + (i.Wert2 - Referenzdatensatz.Wert2) ^ 2)
    4. 'Alle Datensätze nach Nähe sortiert:
    5. Dim Sorted = Datensätze.Sort(Function(i) (i.Wert1 - Referenzdatensatz.Wert1) ^ 2 + (i.Wert2 - Referenzdatensatz.Wert2) ^ 2)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Bei diesen Datensätzen muss erstmal definiert werden, was "nahe dran" bedeutet.
    Sind das Koordinaten, dann berechnet sich die Entfernung mit Phytagoras - s.Nikos Post.
    Sind das Familien-Einkommen, dann müsste man einfache Summen bilden.
    Sind das Einnahmen und Ausgaben kann man sich nochmals was ganz anneres ausdenken.

    Steht die Definition von "nahe dran", dann ist zu klären, wo die Daten sind. Niko etwa setzt eine Auflistung von Objekten eines eigenen Datentyps vorraus - gibt es diesen Datentyp schon, oder ist der auch erst noch zu erschaffen/deklarieren?

    Falls "Auflistung, Datentyp, Objekt, deklarieren" nicht ganz klar: Grundlagen: Fachbegriffe
    Wenn man die Daten aus einer DataTable auswerten will - könnt's in etwa auch so gehen...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
    3. Dts.Test.Clear()
    4. Dts.Test.AddTestRow(500, 200)
    5. Dts.Test.AddTestRow(800, 830)
    6. Dts.Test.AddTestRow(550, 350)
    7. Dts.Test.AddTestRow(750, 900)
    8. Dts.Test.AddTestRow(680, 210)
    9. '
    10. Dim TargetRow = (From r In Dts.Test).First
    11. Dim Result = NearestRow(TargetRow)
    12. Stop
    13. End Sub
    14. Function NearestRow(TargetRow As TestRow) As TestRow
    15. Return ((From Row In dts.Test Where Row.ID <> TargetRow.ID Select Row, Difference = CalcRow(Row, TargetRow)).OrderBy(Function(d) d.Difference).FirstOrDefault).Row
    16. End Function
    17. Function CalcRow(Row As TestRow, TargetRow As TestRow) As Integer ' hier kann mann individuelle Berechnungen vornehmen
    18. Return Math.Abs(Row.Value1 - TargetRow.Value1) + Math.Abs(Row.Value2 - TargetRow.Value2)
    19. End Function
    20. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    ErfinderDesRades schrieb:

    Bei diesen Datensätzen muss erstmal definiert werden, was "nahe dran" bedeutet.
    Sind das Koordinaten, dann berechnet sich die Entfernung mit Phytagoras - s.Nikos Post.
    Sind das Familien-Einkommen, dann müsste man einfache Summen bilden.
    Sind das Einnahmen und Ausgaben kann man sich nochmals was ganz anneres ausdenken.



    Das sind Koordinaten.
    Leider kann ich mit

    Quellcode

    1. ​s.Nikos Post.
    nicht viel Anfangen.