2 Listen verbinden aber dabei ohne doppelte Einträge

  • VB.NET

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

    2 Listen verbinden aber dabei ohne doppelte Einträge

    Guten Abend,
    Ich habe 2 List of sPoint und möchte diese gern verbinden.

    Quellcode

    1. List1.AddRange(List2)


    VB.NET-Quellcode

    1. Public Class sPoint
    2. Public b As Boolean = False
    3. Public p As Point
    4. End Class


    Aber wie kann ich am besten prüfen ob "p" in liste 1 schon existiert? Damit der Point nur einmal vorkommt.

    Vielen Dank
    In Arbeit...
    Morgen @vico255

    Wenn ich so eine Frage sehe, dann frag ich mich sofort, was willst du Vergleichen.

    Möchtest du ein Referenz-Vergleich oder einen Value-Vergleich machen?
    Ich tippe auf das Zweitere.

    Wenn zwei Listen miteinander vereint werden sollen, wobei eine Aussonderung
    der doppelten Werte gewünscht ist, dann kann das mit UNION gemacht werden.

    Nur in deinem Fall mit Point-Array könnte ich mir vorstellen, dass das eventuell
    nicht hinhauen wird.

    Probiere es aus.

    Freundliche Grüsse

    exc-jdbi
    @Steppenpferd

    Versuch das mal mit einer weit komplexeren Klasse in der ListOfT.
    Man wird feststellen, dass eine Value-Prüfung nicht einfach nur
    über eine For Each Schleife und Contains lösbar ist.

    Sind hingegen primitive Datentypen in der ListOfT, reicht eine Prüfung
    auf Contains meistens.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    @exc-jdbi versteh ich grad nicht...
    was verstehst Du unter einer komplexeren Klasse?
    ein Beispiel von Dir wäre nett.

    Hier mein Beispiel mit einer Klasse mit 2 Variablentypen. Ich seh da wirklich nicht warum es so nicht gehen sollte.

    Hier die test-Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class test
    2. Private s As String
    3. Private p As Point
    4. Public Sub New(s1 As String, p1 As Point)
    5. s = s1
    6. p = p1
    7. End Sub
    8. Public Function GetString() As String
    9. Dim str As String = s
    10. Return str
    11. End Function
    12. Public Function GetPoint() As Point
    13. Dim poi As Point = p
    14. Return poi
    15. End Function
    16. End Class


    und Form-Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim t1 As New test("hallo", New Point(0, 0))
    3. Dim t2 As New test("welt", New Point(1, 0))
    4. Dim t3 As New test("hallo", New Point(0, 1))
    5. l1.Add(t1)
    6. l1.Add(t2)
    7. l1.Add(t3)
    8. l2.Add(t1)
    9. l2.Add(t2)
    10. For Each p As test In l1
    11. If Not l2.Contains(p) Then
    12. l2.Add(p)
    13. End If
    14. Next
    15. Me.Text = l2(2).GetString & " " & l2(2).GetPoint.ToString
    16. End Sub

    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    Mach das mal mit dieser Klassen-Struktur: Wobei von der ClassFirstLevel im Formular auch eine List(of T) geführt wird..

    VB.NET-Quellcode

    1. Public Class ClassFirstLevel
    2. Public Name As String
    3. Public ClsSndLvl As New List(Of ClassSecondpLevel)
    4. End Class
    5. Public Class ClassSecondpLevel
    6. Public Name As String
    7. Public Cls3rdLvl As New List(Of ClassThirdLevel)
    8. End Class
    9. Public Class ClassThirdLevel
    10. Public Name As String
    11. Public Points As New List(Of Point)
    12. End Class

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    Bin Immer noch auf der suche nach dem Psychologen dir mir mich erklären kann > Me.txt
    Ich hab mir dazu kurz das Beispiel von @vico255 genommen. Das Thema wurde aber sicher schon hier im Forum behandelt.
    Für die die es Interessiert.

    Freundliche Grüsse

    exc-jdbi


    Hier die Klasse mit den mit den entsprechenden IEqualityComparerOfT
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Imports System.Drawing
    4. #Region "Class SPoint and SPointVComparer"
    5. Public Class SPoint
    6. Public pnt As Point
    7. Public check As Boolean
    8. Public Sub New()
    9. Me.check = False
    10. End Sub
    11. End Class
    12. 'Value-Comparer
    13. Public Class SPointVComparer
    14. Implements IEqualityComparer(Of SPoint)
    15. Private ReadOnly OnlyPnt As Boolean
    16. Public Function Equals1(x As SPoint, y As SPoint) As Boolean _
    17. Implements IEqualityComparer(Of SPoint).Equals
    18. If x IsNot Nothing AndAlso y IsNot Nothing Then
    19. Dim res As Boolean = False
    20. If x.pnt.X = y.pnt.X AndAlso
    21. x.pnt.Y = y.pnt.Y Then
    22. res = True
    23. End If
    24. If Not res Then Return False
    25. If Me.OnlyPnt Then Return res
    26. Return x.check = y.check
    27. End If
    28. Return False
    29. End Function
    30. Public Function GetHashCode1(obj As SPoint) As Int32 _
    31. Implements IEqualityComparer(Of SPoint).GetHashCode
    32. If obj Is Nothing Then Return 0
    33. With obj
    34. Dim pnthc = If(Not IsNothing(.pnt),
    35. ((.pnt.X + 2) ^ (.pnt.Y + 2)).GetHashCode,
    36. 0)
    37. 'Dim hc1 = .pnt.X.GetHashCode And .pnt.Y.GetHashCode
    38. 'Dim hc2 = .pnt.X.GetHashCode Or .pnt.Y.GetHashCode
    39. 'Dim hc3 = .pnt.X.GetHashCode Xor .pnt.Y.GetHashCode
    40. Dim checkhc = obj.check.GetHashCode
    41. If Me.OnlyPnt Then checkhc = 1
    42. Return pnthc Xor checkhc
    43. End With
    44. End Function
    45. Public Sub New(Optional _onlypnt As Boolean = False)
    46. Me.OnlyPnt = _onlypnt
    47. End Sub
    48. End Class
    49. 'Reference-Comparer
    50. Public Class SPointRComparer
    51. Implements IEqualityComparer(Of SPoint)
    52. Private ReadOnly OnlyPnt As Boolean
    53. Public Function Equals1(x As SPoint, y As SPoint) As Boolean _
    54. Implements IEqualityComparer(Of SPoint).Equals
    55. If x IsNot Nothing AndAlso y IsNot Nothing Then
    56. If x Is y Then Return True
    57. End If
    58. Return False
    59. End Function
    60. Public Function GetHashCode1(obj As SPoint) As Int32 _
    61. Implements IEqualityComparer(Of SPoint).GetHashCode
    62. End Function
    63. Public Sub New(Optional _onlypnt As Boolean = False)
    64. Me.OnlyPnt = _onlypnt
    65. End Sub
    66. End Class
    67. 'ReferenceValue-Comparer
    68. Public Class SPointRVComparer
    69. Implements IEqualityComparer(Of SPoint)
    70. Private ReadOnly OnlyPnt As Boolean
    71. Public Function Equals1(x As SPoint, y As SPoint) As Boolean _
    72. Implements IEqualityComparer(Of SPoint).Equals
    73. If x IsNot Nothing AndAlso y IsNot Nothing Then
    74. If x Is y Then Return True
    75. Dim res As Boolean = False
    76. If x.pnt.X = y.pnt.X AndAlso
    77. x.pnt.Y = y.pnt.Y Then
    78. res = True
    79. End If
    80. If Not res Then Return False
    81. If Me.OnlyPnt Then Return res
    82. Return x.check = y.check
    83. End If
    84. Return False
    85. End Function
    86. Public Function GetHashCode1(obj As SPoint) As Int32 _
    87. Implements IEqualityComparer(Of SPoint).GetHashCode
    88. If obj Is Nothing Then Return 0
    89. With obj
    90. Dim pnthc = If(Not IsNothing(.pnt),
    91. ((.pnt.X + 2) ^ (.pnt.Y + 2)).GetHashCode,
    92. 0)
    93. 'Dim hc1 = .pnt.X.GetHashCode And .pnt.Y.GetHashCode
    94. 'Dim hc2 = .pnt.X.GetHashCode Or .pnt.Y.GetHashCode
    95. 'Dim hc3 = .pnt.X.GetHashCode Xor .pnt.Y.GetHashCode
    96. Dim checkhc = obj.check.GetHashCode
    97. If Me.OnlyPnt Then checkhc = 1
    98. Return pnthc Xor checkhc
    99. End With
    100. End Function
    101. Public Sub New(Optional _onlypnt As Boolean = False)
    102. Me.OnlyPnt = _onlypnt
    103. End Sub
    104. End Class
    105. #End Region


    Prüfung auf Value
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Imports System.Drawing
    4. Public Module ValueComparison
    5. Private Rand As New Random
    6. Public Sub Main()
    7. Dim cnt = 10I
    8. Dim size = 400I
    9. Dim onlypntcheck = False 'false: Alles wird geprüft
    10. For i As Int32 = 0 To cnt - 1
    11. Dim items1 = CreateSPoints(size).ToList
    12. Dim items2 = CreateSPoints(size).ToList
    13. 'BspFunctionalSeparateOut(items1, items2)
    14. BspUnionSeparateOut(items1, items2, onlypntcheck)
    15. Console.WriteLine()
    16. Next
    17. Console.ReadLine()
    18. End Sub
    19. #Region "Beispiele"
    20. Private Sub BspFunctionalSeparateOut(ByVal items1 As List(Of SPoint),
    21. ByVal items2 As List(Of SPoint))
    22. 'Typischer Value-Vergleich über Routinen
    23. Dim newlist = SeparateOut(items1, items2, True)
    24. 'Typischer Value-Vergleich über LINQ
    25. 'Vorsicht: Prüfung nur auf 'pnt'
    26. Dim newlist2 = SeparateOutLinq(items1, items2)
    27. Console.WriteLine("BspFunctionalSeparateOut")
    28. If Equals(newlist, newlist2, True) Then
    29. Console.WriteLine("Equals = {0}", True)
    30. Console.WriteLine("Size = {0}", newlist.Count)
    31. Console.WriteLine()
    32. Return
    33. End If
    34. Console.WriteLine("Equals = {0}", False)
    35. Console.WriteLine()
    36. End Sub
    37. Private Sub BspUnionSeparateOut(ByVal items1 As List(Of SPoint),
    38. ByVal items2 As List(Of SPoint),
    39. ByVal onlypntcheck As Boolean)
    40. 'Typischer Value-Vergleich über UNION
    41. Dim newlist = items1.Union(items2, New SPointVComparer(onlypntcheck)).ToList
    42. 'Typischer Value-Vergleich über Routinen
    43. Dim newlist2 = SeparateOut(items1, items2, onlypntcheck)
    44. Console.WriteLine("BspUnionSeparateOut")
    45. If Equals(newlist, newlist2, True) Then
    46. Console.WriteLine("Equals = {0}", True)
    47. Console.WriteLine("Size = {0}", newlist.Count)
    48. Console.WriteLine()
    49. Return
    50. End If
    51. Console.WriteLine("Equals = {0}", False)
    52. Console.WriteLine()
    53. End Sub
    54. #End Region
    55. #Region "Methoden"
    56. Private Function CreateSPoints(size As Int32) As SPoint()
    57. Return Enumerable.Range(0, size).
    58. Select(Function(x) _
    59. New SPoint _
    60. With {.pnt = New Point(Rand.Next(10 + 1),
    61. Rand.Next(10 + 1)),
    62. .check = If((Rand.Next(Int32.MaxValue) And 1) = 0,
    63. True, False)}).ToArray
    64. End Function
    65. Private Sub PrintOut(lst As IList(Of SPoint))
    66. For Each l In lst
    67. Console.WriteLine("Check ={0}, X = {1}, Y = {2}", l.check, l.pnt.X, l.pnt.Y)
    68. Next
    69. End Sub
    70. #End Region
    71. #Region "LINQ Aussonderung"
    72. Private Function SeparateOutLinq(ByVal lst1 As List(Of SPoint),
    73. ByVal lst2 As List(Of SPoint)) _
    74. As List(Of SPoint)
    75. Dim res = New List(Of SPoint)(lst1.ToArray)
    76. res.AddRange(lst2)
    77. 'VORSICHT:Prüfung NUR auf 'o.pnt'
    78. Return res.GroupBy(Function(o) o.pnt).
    79. Select(Function(g) g.First()).ToList
    80. End Function
    81. #End Region
    82. #Region "Funktionale Aussonderung"
    83. Private Function Equals(ByVal lst1 As List(Of SPoint),
    84. ByVal lst2 As List(Of SPoint),
    85. _onlypnt As Boolean) As Boolean
    86. If lst1 IsNot Nothing AndAlso lst2 IsNot Nothing Then
    87. If lst1.Count > 0 AndAlso lst2.Count = lst1.Count Then
    88. Dim res1 = lst1.OrderBy(Function(pp) pp.pnt.X).ThenBy(Function(pp) pp.pnt.Y)
    89. Dim res2 = lst2.OrderBy(Function(pp) pp.pnt.X).ThenBy(Function(pp) pp.pnt.Y)
    90. For i As Int32 = 1 To res1.Count - 1
    91. If Not res1(i).pnt.X = res2(i).pnt.X AndAlso
    92. Not res1(i).pnt.Y = res2(i).pnt.Y Then
    93. Return False
    94. End If
    95. If Not _onlypnt AndAlso
    96. Not res1(i).check = res2(i).check Then
    97. Return False
    98. End If
    99. Next
    100. Return True
    101. End If
    102. End If
    103. Return False
    104. End Function
    105. Private Function SeparateOut(ByVal lst1 As List(Of SPoint),
    106. ByVal _onlypnt As Boolean) As List(Of SPoint)
    107. If lst1 IsNot Nothing AndAlso lst1.Count > 0 Then
    108. Dim res = New List(Of SPoint), bol As Boolean = True
    109. res.Add(lst1.First)
    110. For i As Int32 = 1 To lst1.Count - 1
    111. For j As Int32 = 0 To res.Count - 1
    112. bol = True
    113. If lst1(i).pnt.X = res(j).pnt.X AndAlso
    114. lst1(i).pnt.Y = res(j).pnt.Y Then
    115. bol = False : If _onlypnt Then Exit For
    116. End If
    117. If Not _onlypnt AndAlso Not bol AndAlso
    118. lst1(i).check = res(j).check Then
    119. bol = False : Exit For
    120. Else bol = True
    121. End If
    122. Next
    123. If bol Then res.Add(lst1(i))
    124. Next
    125. Return res
    126. End If
    127. Return Nothing
    128. End Function
    129. Private Function SeparateOut(ByVal lst1 As List(Of SPoint),
    130. ByVal lst2 As List(Of SPoint),
    131. ByVal _onlypnt As Boolean) As List(Of SPoint)
    132. If lst1 IsNot Nothing AndAlso lst2 IsNot Nothing Then
    133. If lst1.Count > 0 AndAlso lst2.Count = lst1.Count Then
    134. Dim bol As Boolean = True
    135. Dim res = SeparateOut(lst1, _onlypnt).ToList
    136. For i As Int32 = 0 To lst2.Count - 1
    137. For j As Int32 = 0 To res.Count - 1
    138. bol = True
    139. If lst2(i).pnt.X = res(j).pnt.X AndAlso
    140. lst2(i).pnt.Y = res(j).pnt.Y Then
    141. bol = False : If _onlypnt Then Exit For
    142. End If
    143. If Not _onlypnt AndAlso Not bol AndAlso
    144. lst2(i).check = res(j).check Then
    145. bol = False : Exit For
    146. Else : bol = True
    147. End If
    148. Next
    149. If bol Then res.Add(lst2(i))
    150. Next
    151. Return res
    152. End If
    153. End If
    154. Return Nothing
    155. End Function
    156. #End Region
    157. End Module


    Prüfung Auf Reference
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Imports System.Drawing
    4. Public Module ReferenceComparison
    5. Private Rand As New Random
    6. Dim Scale As New List(Of Int32())
    7. Public Sub Main()
    8. Dim cnt = 10I
    9. Dim size = 400I
    10. Dim onlypntcheck = False 'Alles wird geprüft
    11. For i As Int32 = 0 To cnt - 1
    12. Dim items1 = CreateSPoints(size).ToList
    13. Dim items2 = CreateSPoints(size).ToList
    14. BspUnionSeparateOut(items1, items2, onlypntcheck)
    15. Scale.Clear()
    16. 'Console.WriteLine()
    17. Next
    18. Console.ReadLine()
    19. End Sub
    20. #Region "Beispiele"
    21. Private Sub BspUnionSeparateOut(ByVal items1 As List(Of SPoint),
    22. ByVal items2 As List(Of SPoint),
    23. ByVal onlypntcheck As Boolean)
    24. Dim newlist = items1.Union(items2, New SPointRComparer(onlypntcheck)).ToList
    25. Dim _cnt = 0I, bol = False
    26. Array.ForEach(Scale.ToArray, Sub(x) _cnt += x.Count \ 2)
    27. If (items1.Count * 2) - _cnt = newlist.Count Then
    28. Console.WriteLine(True) : Return
    29. End If
    30. Console.WriteLine(False)
    31. End Sub
    32. #End Region
    33. #Region "Methoden"
    34. Private Function CreateSPoints(size As Int32) As SPoint()
    35. Dim res = Enumerable.Range(0, size).
    36. Select(Function(x) _
    37. New SPoint _
    38. With {.pnt = New Point(Rand.Next(10 + 1),
    39. Rand.Next(10 + 1)),
    40. .check = If((Rand.Next(Int32.MaxValue) And 1) = 0,
    41. True, False)}).ToArray
    42. Dim cnt = Rand.Next(2, size \ 10)
    43. cnt = If((cnt And 1) = 0, cnt, cnt - 1)
    44. Dim _scale = Enumerable.Range(0, size).OrderBy(Function(x) Rand.Next).Take(cnt).ToArray
    45. Scale.Add(_scale)
    46. With Rand
    47. For i As Int32 = 0 To _scale.Length - 1 Step 2
    48. res(_scale(i)) = res(_scale(i + 1))
    49. Next
    50. Return res
    51. End With
    52. End Function
    53. Private Sub PrintOut(lst As IList(Of SPoint))
    54. For Each l In lst
    55. Console.WriteLine("Check ={0}, X = {1}, Y = {2}", l.check, l.pnt.X, l.pnt.Y)
    56. Next
    57. End Sub
    58. #End Region
    59. End Module


    Prüfung auf Reference and Value
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Imports System.Drawing
    4. Public Module RVComparison
    5. Private Rand As New Random
    6. Public Sub Main()
    7. Dim cnt = 10I
    8. Dim size = 400I
    9. Dim onlypntcheck = False
    10. For i As Int32 = 0 To cnt - 1
    11. Dim items1 = CreateSPoints(size).ToList
    12. Dim items2 = CreateSPoints(size).ToList
    13. BspUnionSeparateOut(items1, items2, onlypntcheck)
    14. Next
    15. Console.ReadLine()
    16. End Sub
    17. #Region "Beispiele"
    18. Private Sub BspUnionSeparateOut(ByVal items1 As List(Of SPoint),
    19. ByVal items2 As List(Of SPoint),
    20. ByVal onlypntcheck As Boolean)
    21. Dim newlist = items1.Union(items2, New SPointRVComparer(onlypntcheck)).ToList
    22. Dim newlist2 = SeparateOut(items1, items2, onlypntcheck)
    23. Console.WriteLine("BspUnionSeparateOut")
    24. If Equals(newlist, newlist2, True) Then
    25. Console.WriteLine("Equals = {0}", True)
    26. Console.WriteLine("Size = {0}", newlist.Count)
    27. Console.WriteLine()
    28. Return
    29. End If
    30. Console.WriteLine("Equals = {0}", False)
    31. Console.WriteLine()
    32. End Sub
    33. #End Region
    34. #Region "Methoden"
    35. Private Function CreateSPoints(size As Int32) As SPoint()
    36. Dim res = Enumerable.Range(0, size).
    37. Select(Function(x) _
    38. New SPoint _
    39. With {.pnt = New Point(Rand.Next(10 + 1),
    40. Rand.Next(10 + 1)),
    41. .check = If((Rand.Next(Int32.MaxValue) And 1) = 0,
    42. True, False)}).ToArray
    43. Dim cnt = Rand.Next(2, size \ 10)
    44. cnt = If((cnt And 1) = 0, cnt, cnt - 1)
    45. Dim _scale = Enumerable.Range(0, size).OrderBy(Function(x) Rand.Next).Take(cnt).ToArray
    46. With Rand
    47. For i As Int32 = 0 To _scale.Length - 1 Step 2
    48. res(_scale(i)) = res(_scale(i + 1))
    49. Next
    50. Return res
    51. End With
    52. End Function
    53. Private Sub PrintOut(lst As IList(Of SPoint))
    54. For Each l In lst
    55. Console.WriteLine("Check ={0}, X = {1}, Y = {2}", l.check, l.pnt.X, l.pnt.Y)
    56. Next
    57. End Sub
    58. #End Region
    59. #Region "Funktionale Aussonderung"
    60. Private Function Equals(ByVal lst1 As List(Of SPoint),
    61. ByVal lst2 As List(Of SPoint),
    62. _onlypnt As Boolean) As Boolean
    63. If lst1 IsNot Nothing AndAlso lst2 IsNot Nothing Then
    64. If lst1.Count > 0 AndAlso lst2.Count = lst1.Count Then
    65. Dim res1 = lst1.OrderBy(Function(pp) pp.pnt.X).ThenBy(Function(pp) pp.pnt.Y)
    66. Dim res2 = lst2.OrderBy(Function(pp) pp.pnt.X).ThenBy(Function(pp) pp.pnt.Y)
    67. For i As Int32 = 1 To res1.Count - 1
    68. If Not res1(i).pnt.X = res2(i).pnt.X AndAlso
    69. Not res1(i).pnt.Y = res2(i).pnt.Y Then
    70. Return False
    71. End If
    72. If Not _onlypnt AndAlso
    73. Not res1(i).check = res2(i).check Then
    74. Return False
    75. End If
    76. Next
    77. Return True
    78. End If
    79. End If
    80. Return False
    81. End Function
    82. Private Function SeparateOut(ByVal lst1 As List(Of SPoint),
    83. ByVal _onlypnt As Boolean) As List(Of SPoint)
    84. If lst1 IsNot Nothing AndAlso lst1.Count > 0 Then
    85. Dim res = New List(Of SPoint), bol As Boolean = True
    86. res.Add(lst1.First)
    87. For i As Int32 = 1 To lst1.Count - 1
    88. For j As Int32 = 0 To res.Count - 1
    89. bol = True
    90. If lst1(i).pnt.X = res(j).pnt.X AndAlso
    91. lst1(i).pnt.Y = res(j).pnt.Y Then
    92. bol = False : If _onlypnt Then Exit For
    93. End If
    94. If Not _onlypnt AndAlso Not bol AndAlso
    95. lst1(i).check = res(j).check Then
    96. bol = False : Exit For
    97. Else bol = True
    98. End If
    99. Next
    100. If bol Then res.Add(lst1(i))
    101. Next
    102. Return res
    103. End If
    104. Return Nothing
    105. End Function
    106. Private Function SeparateOut(ByVal lst1 As List(Of SPoint),
    107. ByVal lst2 As List(Of SPoint),
    108. ByVal _onlypnt As Boolean) As List(Of SPoint)
    109. If lst1 IsNot Nothing AndAlso lst2 IsNot Nothing Then
    110. If lst1.Count > 0 AndAlso lst2.Count = lst1.Count Then
    111. Dim bol As Boolean = True
    112. Dim res = SeparateOut(lst1, _onlypnt).ToList
    113. For i As Int32 = 0 To lst2.Count - 1
    114. For j As Int32 = 0 To res.Count - 1
    115. bol = True
    116. If lst2(i).pnt.X = res(j).pnt.X AndAlso
    117. lst2(i).pnt.Y = res(j).pnt.Y Then
    118. bol = False : If _onlypnt Then Exit For
    119. End If
    120. If Not _onlypnt AndAlso Not bol AndAlso
    121. lst2(i).check = res(j).check Then
    122. bol = False : Exit For
    123. Else : bol = True
    124. End If
    125. Next
    126. If bol Then res.Add(lst2(i))
    127. Next
    128. Return res
    129. End If
    130. End If
    131. Return Nothing
    132. End Function
    133. #End Region
    134. End Module
    @NoIde Komplex ja und entschuldige aber von der Mauen Aufgabenstellung, bis hin zu einer Sinnvollen Anwendung deines Beispiels für irgendetwas, reicht mein Horizont nicht aus.

    @exc-jdbi hier sehe ich eine umfangreiche klasse, aber Komplex Definiere ich iwie anders.
    Im Endeffekt sehe ich da auf den ersten Blick etliche Beispiel-Generatoren, Comparer und Funktionen um an bestimmte Werte zu gelangen, aber trotz des Umfangs wird immer mit höchstens 2 List(Of Point) gearbeitet.
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    @Steppenpferd: Ich geb mal gerade meinen Senf zu Post#4. Da schreibst Du: For Each p As Point In list1. Dies widerspricht aber den Voraussetzungen aus Post#1:

    vico255 schrieb:

    Ich habe 2 List of sPoint



    Wenn man den Code nun ändert zu

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. list1.Add(New sPoint With {.p = New Point(1, 1), .b = True})
    3. list1.Add(New sPoint With {.p = New Point(1, 1), .b = True})
    4. For Each p In list1
    5. If Not list2.Contains(p) Then
    6. list2.Add(p)
    7. End If
    8. Next
    9. End Sub
    dann erhält man eine list2 mit 2 Einträgen, weil eben trotz gleicher Werte der 1. sPoint-Eintrag ungleich der 2. sPoint-Eintrag ist. Andere Objekte. Ein Contains ist somit nicht möglich, ohne einen (komplexeren) Einzelwertevergleich zu machen. Und da müsste der TE entscheiden, unter welchen Umständen zwei sPoint-Einträge als gleich anzuerkennen sind.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @Steppenpferd

    Klar handelt es sich hier NUR um 2 ListOfT. Sehr einfache sogar.
    Wie man so etwas für komplexere Klassen entwickelt, habe ich hoffentlich mit meinen Beispiel gezeigt.

    Klar sieht es für den ersten Blick, unübersichtlich aus. Ich bin mir jedoch sicher, wenn du wirklich gewillt
    bis was zu lernen, dann würdest du den Code verstehen wollen. Und damit meine ich, selber hinterfragen
    warum ich das so mache und warum ich das so löse.

    In erster Linie geht es bei der Entwicklung von Lösungen immer darum, sicherstellen zu können, dass das
    was man programmiert hat auch zu 100% stimmt. Ich mache das, in dem ich mehrere Möglichkeiten Lösungen
    gegeneinander ausspiele. Und sind schlussendlich beide Resultate richtig, so bin ich mir auch sicher es funktioniert.

    Was du gleich gar nicht erwarten darfst von mir, ist ein fertiger Code extra für dich gemacht. Nein der der sich
    für meinen Code interessiert, darf ruhig auch ein wenig mitdenken.

    Freundliche Grüsse

    exc-jdbi
    Ohh hier wird ja ordentlich diskutiert :)

    Ich prüfe bei einfachen Abfragen auch mit Contains und das funktioniert soweit auch.
    Für mich war einfach die Frage, wenn ich eben eine List of "Eigene Klasse" mit öffentlichen Membern habe, wie man dort eben prüft.

    Hier war einfach das Problem, das ich die Liste der anderen Liste hinzufügen wollte, Ohne das es Duplikate von Point(p) gibt.

    Die Liste1 sind Ergebnisse von gefunden Points in einer Bitmap.
    Die Liste2 entsteht durch einen Suchalgorithmus.
    Jetzt kann es aber sein das in der Liste2 Points in Liste1 bereits existieren.

    Meine Frage war nun wie kann ich bei meinem Beispiel Liste2 zu Liste1 hinzufügen ohne dabei doppelte Points (p) zu haben.
    In Arbeit...
    Wenn es (wie Du bereits geschrieben hast X/ ) nur um den Point an sich geht (wofür ist dann eigentlich b?), dann wohl am einfachsten mit:

    VB.NET-Quellcode

    1. For Each ListEntry In list1
    2. If Not list2.Select(Function(x) x.p).Contains(ListEntry.p) Then
    3. list2.Add(ListEntry)
    4. End If
    5. Next
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @vico255

    Das war irgendwie mein Gedanke.
    Wie es aussieht holst du die "Koordinaten" per Value in ein Point-Datentyp.
    Für mich stellt sich nur die Frage gibt es auch noch eine andere Möglichkeit. Handelt es sich denn um ein grosses Bitmap, wird die ganze Prozedur (also das Erfassen der Punkte in eine ListOfT) viele Male wiederholt?

    Weil dann wäre es doch ganz sinnvoll referenziell zu arbeiten, sofern das eben möglich ist. Referenziell bedeutet meistens auch sehr hohe Performance. Je nachdem ist es ja sogar erwünscht.

    Freundliche Grüsse

    exc-jdbi
    ich find, hier fehlt noch immer, überhaupt mal zu diskutieren, wann zwei so sPoint-Dinger als gleich gelten sollen.
    Immanent nimmt Vaporized in post#13 jetzt an, zwei sPoint seien gleich, wenn deren p-Feld gleich ist, und das b-Feld sei zu vernachlässigen.
    Kann sein, dass das für des TEs Absichten die richtige Annahme ist, kann aber auch nicht sein.

    (Oder habich die Klärung dieser Frage übersehen?)
    Ich habe es in Post#1 und #12 überlesen und dann eben in #13 erst festgestellt:

    vico255 schrieb:

    Aber wie kann ich am besten prüfen ob "p" in liste 1 schon existiert? Damit der Point nur einmal vorkommt.

    vico255 schrieb:

    Meine Frage war nun wie kann ich bei meinem Beispiel Liste2 zu Liste1 hinzufügen ohne dabei doppelte Points (p) zu haben.
    Das heißt, dass meine Aussage in P#10 überflüssig gewesen wäre:

    VaporiZed schrieb:

    Und da müsste der TE entscheiden, unter welchen Umständen zwei sPoint-Einträge als gleich anzuerkennen sind.
    Aber Du hast insofern recht, weil meine Frage aus P#13 immer noch nicht beantwortet ist:

    VaporiZed schrieb:

    wofür ist dann eigentlich b?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo,
    Ich habe mir mit b(As Boolean) was gedacht, was aber im nachhinein betrachtet unnütz war.
    Dennoch war doch die Frage im #Post1
    Aber wie kann ich am besten prüfen ob "p" in liste 1 schon existiert? Damit der Point nur einmal vorkommt.

    Dh das p(Point) nur einmal vorkommen sollte und b(Boolean) ignoriert werden kann.

    Ich wollte, das die sPoints der Liste1 hinzugefügt werden, sofern p(Point) noch nicht vorhanden ist. Wie Prüfe ich das?

    Ist das Problem hinreichend definiert?
    In Arbeit...
    Moin, hab mir das ganze nochmal in Ruhe durchgelesen und sehe die Sache jetzt so:

    vico255 schrieb:

    Ich habe 2 List of sPoint und möchte diese gern verbinden.

    vico255 schrieb:

    Aber wie kann ich am besten prüfen ob "p" in liste 1 schon existiert? Damit der Point nur einmal vorkommt.

    vico255 schrieb:

    Ich prüfe bei einfachen Abfragen auch mit Contains und das funktioniert soweit auch.


    Er hat 2 Listen in denen die Klasse "sPoint" gespeichert ist.
    Er möchte Prüfen ob der Point(x,y) aus Klassen-Liste2 schon in Klassen-Liste1 existiert.
    Würde er Boolean mit auswerten wollen, würde er seine Frage nicht stellen, da er dies mit Contains auch (wie in #6) erreichen würde.
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    @vico255: guckst Du Post#13
    @Steppenpferd: Was ist bei Dir in Post#6 l1 und l2? Das steht da nicht explizit, obwohl es implizit mir klar ist. Nur: Hast Du Post#10 gelesen? Denn bei Dir stehen zwar in l1 und l2 die selben sPoint-Objekte. Aber Wenn es nur um die Point-Werte geht, funktioniert Dein Code an der Stelle nicht, da unterschiedliche sPoint-Objekte mit gleichen Point-Werten nicht als gleich angesehen werden, obwohl das laut TE so sein sollte.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Danke @VaporiZed, ich wollte jetzt nicht auf jeden Post eingehen, solange nicht jeder wie es mir schien, die Aufgabenstellung verstanden hat.
    Ich werd mir das gleich noch ansehen.


    edit.
    @VaporiZed

    VB.NET-Quellcode

    1. Not list2.Select(Function(x) x.p).Contains(ListEntry.p)


    Danach hab ich gesucht.
    Gibt es das auch für AddRange ?
    In Arbeit...

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