按数字集合对 LINQ 查询元素排序

Order LINQ query elements by a collection of numbers

这是一个部分定义的函数,我用它来检索文本文件的指定行,方法是传递我想要的行的索引:

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 扩展中所做的评估修正为 return 预期结果?

变化:

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

收件人:

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

或者,如果您将 lineNumbers 参数的类型从 IEnumerable(Of Integer) 更改为 List(Of Integer),则您不需要调用 ToList 方法。

尽管如此,我不得不说,虽然我喜欢 LINQ,因为它使代码更具可读性,但这正在突破极限,并且可以说比手动编写循环算法的可读性更差。但是,对每个人来说 :)