2012-03-31 38 views
0

我有兩個文件,一個參議員誰退休和完整的參議員之一。我需要從完整名單中刪除退休的參議員。我正在使用LINQ來處理這個問題,因爲我不能像我期望的那樣工作。我試圖將一個查詢與另一個查詢進行比較,只將參議員從當前名單中退出,然後將他們添加到新文件中。但是當我打開新文件時,它並沒有刪除退休的參議員。這裏是我的代碼感謝提前任何幫助。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) 

回答

1

我不知道我真正理解你的問題,但我認爲第二個查詢應該看起來更像是:

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

這個工作我在那裏發言是錯誤的。謝謝! – amedeiros 2012-03-31 16:51:12

+1

您可以放棄'Let state = data(1)'和'Let party = data(2)',因爲它們沒有被使用。 'senateRetired'返回字符串,因此條件應該是'Not senateRetired.Any(Function(n)n = name)' – 2012-03-31 17:07:07

0

我有一個替代的解決方案是較爲複雜;然而,它使參議員成爲階級。如果你需要做的除了文件創建參議員一些其他的工作,它可能是有用的

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 

有了這個聲明,你可以做到這一點

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)