2012-03-31 4 views
0

У меня есть два файла с сенаторами, которые уходят на пенсию и один из полных сенаторов. Мне нужно удалить отставных сенаторов из полного списка. Я использую LINQ для этого bu itt не работает, как я ожидал бы этого. Я пытаюсь сравнить один запрос с другим, только сенатор из текущего списка, который не уходит на пенсию, а затем добавляет их в новый файл. Но когда я открываю новый файл, он не удаляет отставных сенаторов. Вот мой код, спасибо за любую помощь заранее.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

+1

Вы можете отказаться от 'Let state = data (1)' и 'Let party = data (2)', так как они не используются. Также 'senateRetired' возвращает строки, поэтому условие должно быть' Not senateRetired.Any (Function (n) n = name) ' –

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)