2015-06-18 4 views
1

Это частично определенная функция, которую я использую, чтобы получить указанные строки в текстовом файле, пропускание индекса линий я хочу:Заказать LINQ элементов запроса по коллекции чисел

Public Shared Function GetLines(ByVal sourceFilepath As String, 
           ByVal lineNumbers As IEnumerable(Of Integer)) As IEnumerable(Of String) 

    Return File.ReadAllLines(sourceFilepath, encoding). 
       Select(Function(line As String, index As Integer) 
          Return New With 
            { 
             Key .line = line, 
             Key .index = index + 1 
            } 
         End Function). 
       Where(Function(con) lineNumbers.Contains(con.index)). 
       OrderBy(Function(x) x.index.CompareTo(lineNumbers(x.index))). 
       Select(Function(con) con.line) 

End Function 

Примера использование:

GetLines("C:\file.txt", {1, 5, 6, 2} ' Linenumbers 1, 5, 6, and 2. 

проблема заключается в том, что мне нужно сохранить порядок строк, в том же порядке, который я указал индексы, поэтому функция должна упорядочить элементы запроса на указанном порядке {1, 5, 6 , 2}, но вместо этого я получаю строки в следующем порядке: {1, 2, 5, 6}.

Как исправить оценку, которую я делаю в расширении OrderBy, чтобы вернуть ожидаемые результаты ?.

ответ

1

Изменение:

OrderBy(Function(x) x.index.CompareTo(lineNumbers(x.index))) 

To:

OrderBy(Function(x) lineNumbers.ToList().IndexOf(x.index)) 

В качестве альтернативы, если вы изменили тип параметра lineNumbers от IEnumerable(Of Integer) до List(Of Integer), то вам не нужно будет вызывать метод ToList.

Хотя, я должен сказать, в то время как я люблю LINQ, потому что он делает код более читаемым, это подталкивает ограничения и, возможно, менее читабельно, чем писать алгоритм цикла. Но, каждому свое :)

+0

спасибо, но я думаю, что вы ответили, прежде чем я изменил код, чтобы избежать этой проблемы «непроницаемости», я удалил некоторые ненужные части запроса, чтобы избежать беспорядка с типами анонимов, если вы видите, код выше не имеет свойства индекса для доступа, я все равно могу сделать это таким образом? ...и как?. или я должен продолжать использовать другой запрос? , – ElektroStudios

+1

Нет. Я думаю, вам нужно вернуться к тому, как вы это делали раньше, когда вы включали индекс, привязанный к каждой позиции, чтобы затем вы могли упорядочить их по индексу. Если вы не включаете это в результаты 'Select', тогда нет способа узнать в последующих методах, каковы были исходные индексы. –

Смежные вопросы