Announcement

Collapse
No announcement yet.

LINQ - Group By Rückgabe der Classe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • LINQ - Group By Rückgabe der Classe

    Servus zusammen,

    ich schaffe es leider nicht und bitte mal (wieder) um eure Hilfe:

    Code:
         Dim circList As New List(Of Circle)()
    
    
            ' Create iterator for model space entities to search for lines.
            Dim iter As BlockTableRecordEnumerator = modelSpace.GetEnumerator()
            While iter.MoveNext()
    
                Dim obj As DBObject = iter.Current.GetObject(OpenMode.ForWrite)
    
                ' Check if object is   a line.
                If TypeOf obj Is Circle Then
                    Dim c As Circle = DirectCast(obj, Circle)
                    circList.Add(c)
                End If
            End While
    
    ' aus dieser Liste möchte ich nun die "doppelten" Kreise rausholen
    
    ' Linq macht ja mit der Group By relativ einfach ne übersicht hierzu 
    ' mein Problem ist allerdings nach der Gruppierung und Abfrage "Count > 1" wie ich nun die Classe ansprechen kann 
    
     Dim gg = From cir As Circle In circList Group By cir.Radius Into Group, Count() Where Count > 1
    
    ' folgendes klappt zwar (noch) nicht - sollte aber dann etwa so weitergehen
    
    For each c as Circle in gg
    
        c.color = doublecolor 
    
    next for
    mit
    As IEnumerable(Of Circle)
    komme ich so auch nicht ans ziel.

    Bettelblick und danke fürs anschauen

    mfg - r.b
    Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
    Um heute vorm PC zu sitzen!

  • #2
    Das Ergebnis von Group by ist eine anonymer Typ und nicht der Typ auf dem du den Group by ausgeführt hast. In c# würde man jetzt 'var' als Platzhaltertyp nehmen. Die Entsprechung in VB hab ich gerade nicht auf der Pfanne. Kannst du im foreach nicht einfach das as Typ weglassen?

    Comment


    • #3
      Originally posted by Ralf Jansen View Post
      Das Ergebnis von Group by ist eine anonymer Typ und nicht der Typ auf dem du den Group by ausgeführt hast. In c# würde man jetzt 'var' als Platzhaltertyp nehmen. Die Entsprechung in VB hab ich gerade nicht auf der Pfanne. Kannst du im foreach nicht einfach das as Typ weglassen?
      ja geht schon ...

      allerdings erhalte ich dann ja nicht die Circle.Color zum ändern (zurück)

      och menno ... ich bin echt zu doof ...

      gibt nicht ne bessere methode um eben z.b. aus 1000 Kreisen die "gleichen" zu finden ?
      wobei "gleich" ja relativ ist bzw. sein sollte (mal der durchmesser, mal die aktuelle position mal beides)

      :-)


      =============
      mal dies versuchen werde ...
      Code:
      ''' <summary>
      ''' Diese Funktion löscht mit linearem Aufwand doppelte Einträge aus einem List(Of T) Array
      ''' </summary>
      ''' <param name="List">Das Array dessen doppelte Einträge gelöscht werden sollen</param>
      Public Function RemoveDoubleItems(ByVal List As List(Of String)) As List(Of String)
          Dim KeyList As New Generic.Dictionary(Of String, String)
          Dim NewList As New List(Of String)
      
          For Each Item As String In List
              If KeyList.ContainsKey(Item) = False Then
                  KeyList.Add(Item, String.Empty)
                  NewList.Add(Item)
              End If
          Next
          Return NewList
      End Function
      Zuletzt editiert von Fremder; 08.11.2012, 16:45.
      Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
      Um heute vorm PC zu sitzen!

      Comment


      • #4
        allerdings erhalte ich dann ja nicht die Circle.Color zum ändern (zurück)
        Wie gesagt das was du da zurückbekommst ist ja nicht der ursprüngliche Typ sondern eine Gruppierung.
        Also ein Ding mit der Aussage 'folgende Daten sind an 7 Datensätzen gleich' .Wenn du dann den Wert dieses gruppierten Datensatzes änderst welchem der 7 ursprünglichen Datensätze willst du dann die Änderung unterschieben? Das geht nicht. Die Gruppierung hat keinen Bezug mehr zu ihrer Quelle.

        Um Gleiche zu finden hilft also kein Group by weder in LINQ noch in SQL. Gleiche/Ähnliche in einer Tabelle finden läuft normalerweise über einen Self Join. Dann hast du jedes gleiche Paar und kannst dann entscheiden welcher der beiden (oder n) gelöscht/geändert/verflucht oder was auch immer gehört.

        Comment


        • #5
          Hallo Ralf,
          danke für die Infos.

          ich mache es nun wie "einfach" so und es geht dann ja auch - recht flott:
          Code:
            ''' <summary>
              ''' Diese Funktion löscht mit linearem Aufwand doppelte Einträge aus einem List(Of T) Array
              ''' </summary>
              ''' <param name="List">Das Array dessen doppelte Einträge gelöscht werden sollen</param>
              Public Function RemoveDoubleItems(ByVal List As List(Of Circle)) As List(Of Circle)
                  Dim KeyList As New Generic.Dictionary(Of Double, Double)
                  Dim NewList As New List(Of Circle)
          
          
                  For Each Item As circle In List
          
                      Dim expo As Double = (Item.Radius + 0.0001) * (Math.Round(Item.Center.X, 1) + 0.0001) * (Math.Round(Item.Center.Y, 1) + 0.0001)
          
                      If KeyList.ContainsKey(expo) = False Then
                          KeyList.Add(expo, 0)
                          NewList.Add(Item)
                      Else
                          Item.Center = New Point3d(-1000, 0, 0)
                          ' und lösche die kreise dann "manuel" ... da ich aktuell keinen peil habe wie ich die in .net -> remove delete oder sonstwas 
          
          
                      End If
                  Next
                  Return NewList
              End Function
          Self Join habe ich noch nicht ausprobiert ...
          wenn du da zuuuufällig ein beispiel hättest - gern ;-)

          und nochmal dank
          rb
          Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
          Um heute vorm PC zu sitzen!

          Comment

          Working...
          X