Вот пример, который даст вам массив Tuple(Of Double, Double)
:
Dim data = IO.File.ReadLines(filePath).
Skip(2).
Select(Function(line)
Dim parts = line.Split(","c)
Return Tuple.Create(CDbl(parts(0)), CDbl(parts(1)))
End Function).
ToArray()
Метод IO.File.ReadLines
будет читать строки файла. Если метод ReadAllLines
читает весь файл, а затем возвращает строки в виде массива String
, метод ReadLines
представляет строки файла в виде перечислимого списка, и строки считываются из файла только при их использовании. , В частности, для больших файлов ReadLines
более эффективен, чем ReadAllLines
, поскольку он сначала создает промежуточный массив, который вам на самом деле не нужен.
Метод Skip
позволяет получить доступ к элементам в списке, начиная с определенного индекса. В случае чтения файла вам нужно читать каждую строку независимо, но вызов Skip(2)
для результата File.ReadLines
означает, что первые две строки файла будут отброшены после чтения, а любая последующая обработка будет только выполнена, но строки от третьего.
Метод Select
- это в основном преобразование. В нем говорится, создать список вывода, содержащий элемент для каждого элемента в списке ввода, где элемент вывода является результатом преобразования элемента ввода. Преобразование определяется функцией, которую вы предоставляете. В этом случае строка из файла является входной, и преобразование состоит в том, чтобы разделить эту строку на запятую, преобразовать две подстроки в значения Double
и затем создать Tuple
, содержащий эти два значения Double
.
Метод ToArray
берет любой перечисляемый список, то есть любой объект, который реализует IEnumerable(Of T)
, и возвращает массив, содержащий элементы из этого списка. В этом случае Select
возвращает IEnumerable(Of Tuple(Of Double, Double))
, поэтому ToArray
возвращает массив Tuple(Of Double, Double)
.
Если вы хотите написать все это длинным хендом, то это будет выглядеть так:
'Get all the lines of the file.
Dim step1 As IEnumerable(Of String) = IO.File.ReadLines(filePath)
'Skip the first two lines.
Dim step2 As IEnumerable(Of String) = step1.Skip(2)
'Split each line into two substrings.
Dim step3 As IEnumerable(Of String()) = step2.Select(Function(line) line.Split(","c))
'Convert substrings to numbers and combine.
Dim step4 As IEnumerable(Of Tuple(Of Double, Double)) = step3.Select(Function(parts) Tuple.Create(CDbl(parts(0)), CDbl(parts(1))))
'Create an array of Tuples.
Dim data As Tuple(Of Double, Double)() = step4.ToArray()
A Tuple
- это объект общего назначения для группировки значений. Вы можете использовать Tuple
для разовых случаев, а не для определения своего собственного класса. Вы можете предпочесть определить свой собственный класс во всех случаях, и вы должны определить свой собственный класс, где вы будете широко использовать данные. В этом случае ваш собственный класс может выглядеть так:
Public Class RefTrans
Public Property Wavelength As Double
Public Property TransPercent As Double
End Class
и код станет:
Dim data = IO.File.ReadLines(filePath).
Skip(2).
Select(Function(line)
Dim parts = line.Split(","c)
Return New RefTrans With {.Wavelength = CDbl(parts(0)),
.TransPercent = CDbl(parts(1))}
End Function).
ToArray()
В этом случае у вас есть свойства Wavelength
и TransPercent
для каждого элемента вашего массива. Если вы используете Tuples
, то свойства имеют общие имена Item1
и Item2
.
Если у вас есть массив, вы можете использовать любую подходящую перегрузку Array.Sort
для выполнения сортировки, например,
Array.Sort(data, Function(d1, d2) d1.Item1.CompareTo(d2.Item1))
Это позволит отсортировать Tuples
путем сравнения их свойств Item1
, которые содержат значения длины волны. Если вы используете свой собственный класс, то, очевидно, вы указываете свое собственное свойство, например, Wavelength
свойство в классе RefTrans
, которое я показал.