按数字集合对 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,因为它使代码更具可读性,但这正在突破极限,并且可以说比手动编写循环算法的可读性更差。但是,对每个人来说 :)
这是一个部分定义的函数,我用它来检索文本文件的指定行,方法是传递我想要的行的索引:
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,因为它使代码更具可读性,但这正在突破极限,并且可以说比手动编写循环算法的可读性更差。但是,对每个人来说 :)