2012-03-31 14 views
0

Ich habe zwei Dateien eins mit Senatoren, die in Rente gehen und einer der kompletten Senatoren. Ich muss die ausscheidenden Senatoren aus der vollständigen Liste entfernen. Ich benutze LINQ für dieses bu es funktioniert nicht so, wie ich es erwarten würde. Ich versuche, eine Abfrage mit einer anderen zu vergleichen, nehme nur den Senator aus der aktuellen Liste, der nicht in den Ruhestand geht, und füge ihn dann in eine neue Datei ein. Aber wenn ich die neue Datei öffne, hat sie die pensionierten Senatoren nicht entfernt. Hier ist mein Code Danke für jede Hilfe im Voraus.Visual Basic LINQ

 ' Query for retired senators 
    Dim senateRetiered = From line In retieredSen 
         Let data = line.Split(","c) 
         Let retName = data(0) 
         Select retName 

    ' query length 
    Dim index As Integer = senateRetiered.ToArray.Length 

     ' Add one to our index we will remove it later in our next query 
    index += 1 

    ' Query for or 110th senate compare to our other query and only select senators that have not retiered 
    Dim senate110Query = From line In senate110 
         Let data = line.Split(","c) 
         Let name = data(0) 
         Let state = data(1) 
         Let party = data(2) 
         Where name <> senateRetiered(index - 1) 
         Select line 

     ' Write the remaining sentators to a new file 
    IO.File.WriteAllLines("sortedSentate.txt", senate110Query) 

Antwort

1

Ich bin nicht sicher, ob ich wirklich Ihre Frage verstanden, aber ich denke, die zweite Abfrage so aussehen sollte:

Dim senate110Query = From line In senate110 
        Let data = line.Split(","c) 
        Let name = data(0) 
        Let state = data(1) 
        Let party = data(2) 
        Where Not senateRetired.Any(Function(r) r.Name = name) 
        Select line 
+0

Das funktionierte meine, wo Aussage falsch war. Vielen Dank! – amedeiros

+1

Sie können 'Let state = data (1)' und 'Let party = data (2)' löschen, da sie nicht verwendet werden. Auch 'senateRetired' gibt Strings zurück, daher sollte die Bedingung' Not senateRetired.Any (Funktion (n) n = name) 'lauten –

0

ich eine alternative Lösung haben, die etwas komplizierter ist; es ergibt jedoch die Senatoren als Klasse. Wenn Sie einige andere Arbeiten mit Senatoren zusätzlich tun müssen, Kreation einreichen könnte es

Class Senator 
    Public Name As String 
    Public State As String 
    Public Party As String 

    Public Overrides Function Equals(ByVal obj As Object) As Boolean 
     Dim other = TryCast(obj, Senator) 
     If other Is Nothing Then 
      Return False 
     End If 
     Return Name.Equals(other.Name) 
    End Function 

    Public Overrides Function ToString() As String 
     Return String.Format("{0},{1},{2}", Name, State, Party) 
    End Function 
End Class 

Mit dieser Erklärung hilfreich sein, können Sie dieses tun

Dim senateRetiered = From line In retieredSen _ 
Let data = line.Split(","c) _ 
Select New Senator() With {.Name = data(0)} 

Dim senate110Query = From line In senate110 _ 
Let data = line.Split(","c) _ 
Select New Senator() With {.Name = data(0), .State = data(1), .Party = data(2)} 

Dim nonRetired = senate110Query.Except(senateRetiered) 

Dim nonRetiredString = nonRetired _ 
.Select(Function(sen) sen.ToString()) 
'Note: I have to append a ".ToArray()" with .NET 3.5 

IO.File.WriteAllLines("sortedSentate.txt", nonRetiredString)