2017-09-08 1 views
0

Ich haben Baumklassen wie folgt:sortieren bestimmte Objekte

Public Class HtmlSection 
     Property Name As String 
     Property SubSections As List(Of HtmlSubSection) 
End Class 

Public Class HtmlSubSection 
     Property Name As String 
     Property SelectedSentences As List(Of HtmlSentence) 
End Class 

Public Class HtmlSentence 
     Property Sentence As String 
     Property Position As Integer 
End Class 

In folgenden Verfahren i für jeden Abschnitt für alle Sätze sind auf der Suche nach bestimmtem Abschnitt gehört, am Ende i die Datensätze nach Position asc sortieren. Aber manchmal müssen die Positionen geändert werden (direkt in den Sätzen), weil es Lücken geben könnte, nachdem ich OrderBy bestellt habe, aber es könnte wie folgt aussehen. Gibt es einen einfachen Weg wie Linq, um die Positionen dieser Sätze zu ändern, um Lücken zu vermeiden, sagen wir in der Methode, die ich unten zeige.

2 
5 
77 
1001 

i Positionen ändern 0 in unserem Beispiel beginnen möchten:

0 
1 
2 
3 

Methode:

Public Function GetSelectedSentencesOnSectionLevel(section As HtmlSection) As List(Of HtmlSentence) 
    Dim sentencesList As New List(Of HtmlSentence) 
     For Each exSection As HtmlSection In _htmlFactory.SectionsList 
     If exSection.Name = section.Name Then 
      Dim sentencesList As New List(Of HtmlSentence) 
      If Not IsNothing(exSection.SubSections) Then 
       For Each exSubsection As HtmlSubSection In exSection.SubSections 
        If Not IsNothing(exSubsection.SelectedSentences) Then 
        For Each exSentence As HtmlSentence In exSubsection.SelectedSentences 
          sentencesList.Add(exSentence) 
        Next 
        End If 
       Next 
      End If 
     End If  
    Next 

'sort sentences by Posiions ascending 
sentencesList = sentencesList.OrderBy(Function(x) x.Position).ToList()    
Return sentencesList 
End Function 

EDIT: mehr Code für Helfer:

global Klasse:

Public Class HtmlFactory 
     Property SectionsList As List(Of HtmlSection) 

     Sub New() 
      SectionsList = New List(Of HtmlSection) 
     End Sub 

     Sub New(pSectionsList As List(Of HtmlSection)) 
      _SectionsList = pSectionsList 
     End Sub 

     Public Sub AddSection(section As HtmlSection) 
      SectionsList.Add(section) 
     End Sub 
.... 
+0

An welcher Sammlung arbeiten Sie? –

+0

@BozhidarStoinev was meinst du, alles oben. – Dino

+0

Ich meine, dass Sie nicht bestimmen können, was der Unterabschnitt eines Satzes ist, wenn Sie nur 'List (Of HtmlSentence)' haben ... Woher kommt 'exSection'? –

Antwort

1

Hier sind Sie eine reine LINQ-Lösung.

Dim index As Integer = -1 

Dim sectionName As String 

Dim allTheSections As List(Of HtmlSection) 

Dim sentenceList = allTheSections _ 
    .Where(Function(sect) _ 
       sect.SubSections IsNot Nothing _ 
       AndAlso sect.Name.Equals(sectionName, StringComparison.OrdinalIgnoreCase)) _ 
    .SelectMany(Function(sect) sect.SubSections) _ 
    .Where(Function(subSect) subSect.SelectedSentences IsNot Nothing) _ 
    .SelectMany(Function(subSect) subSect.SelectedSentences) _ 
    .OrderBy(Function(ss) ss.Position) _ 
    .Select(Function(ss) 
       index += 1 
       Return New HtmlSentence With {.Position = index, .Sentence = ss.Sentence} 
      End Function) _ 
    .ToList() 

In diesem Beispiel ist allTheSections wo Sie exSection von nicht kommen.

+0

Also sollte ich List (Of HtmlSections) an allTheSections Variable übergeben und dann an sectionName Variable, sollte ich den Namen des Abschnitts übergeben, mit dem ich spielen möchte und dann Ihre linq Positionen ändern wird von 0 zählen (die aktuelle Reihenfolge beibehalten - das ist wichtig) und Ruhe bewahren, wie es in der Sammlung war? Ist das alles wahr? – Dino

+0

Rechts. Wenn Sie jedoch möchten, dass die Zählung bei 0 beginnt, müssen Sie den Index auf -1 initialisieren. I.e. 'Dim Index As Integer = -1' –

+0

Ich änderte ein bisschen Ihren Code und fügte ss.Position = index nach Zeilenindex + = 1 hinzu, weil ich auch neue Positionen in oryginal Sammlung speichern möchte. Allerdings gibt es ein Problem, dass Ihr Code nicht auf die aktuelle Reihenfolge der Positionen achtet ... Zum Beispiel, wenn wir vorher zb hatten: für Satz_1 pos war = 99 für Satz_2 pos war 6 und für Satz_3 war pos 3, also sollte es endlich sein: Satz_1 Pos = 3 Satz_2 Pos 2 Satz_3 Pos 1. Ich hoffe, Sie verstehen, was ich meine. Sie können Testcode verwenden: https://pastebin.com/XU9UvDR0 – Dino

Verwandte Themen