使用VB 2013,我在每个字符串中的子字符串上排序字符串数组时遇到问题

时间:2015-10-06 15:58:17

标签: vb.net sorting visual-studio-2013 arraylist

我认为这很简单,但出于某种原因它不会来找我......

这是我目前的代码

Dim fileReader As New StreamReader(FOfileToProcess)
Dim sLine As String = ""
Dim fileText As New ArrayList()
Do Until fileReader.EndOfStream()
    sLine = fileReader.ReadLine()
    If Not sLine Is Nothing Then fileText.Add(sLine)
Loop
fileReader.Close()
fileText.Sort(20, 2, Nothing) 'My intention is to sort by the values at zero-based 20 for 2 characters
fileText.Sort(63, 9, Nothing) '... and likewise at zero-based 63 for 9 characters
Dim saText() As String = DirectCast(fileText.ToArray(GetType(String)), String())
File.WriteAllLines(FOfileToProcess + "_sorted", saText)

它有效,但写出的'_sorted'文件未正确排序。这只是纠正我的排序字段的问题吗?原始排序是一个2字段排序,主要是第63列,第二列是第20列,但由于只有一组参数,我认为第一个是第二个并以主要结束。

建议?

TIA!

2 个答案:

答案 0 :(得分:0)

ArrayList.Sort(Int32, Int32, IComparer)不会通过子字符串对字符串进行排序。您可以指定要排序的范围,因此字符串21到23和64到73。

您希望按每个字符串中的子字符串进行排序。我可以使用LINQ和ReadLines / WriteAllLines

为您提供更具可读性的方法
Dim lines = From line In System.IO.File.ReadLines(FOfileToProcess)
            Where line.Length >= 73
            Let col1 = line.Substring(20, 2)
            Let col2 = line.Substring(63, 9)
            Order By col1 Ascending, col2 Ascending
            Select line
System.IO.File.WriteAllLines(FOfileToProcess + "_sorted", lines)

答案 1 :(得分:0)

首先,请勿使用ArrayList,因为它不允许您指定商品的类型。相反,请使用List(Of T)

Dim fileText As New List(Of String)

其次,Sort方法的索引与行号有关,而与字符串中的位置无关(ArrayList不知道您正在插入字符串)。

Dim fileTextSorted = fileText _
    .OrderBy(Function(s) s.Substring(20, 2)) _
    .ThenBy(Function(s) s.Substring(63, 29))

如果文件包含的行短于子串或空行的所需位置(例如文件末端的一行空行),则使用VB Mid函数优先于{{1}这可能会抛出异常。或者,您可以首先应用Substring条件来放弃此类行:Where或者在阅读文件时不要将这些行添加到列表中。