【问题标题】:vb.net - List (Of String) Sorting, Numbers Ascending, Alphabet Descendingvb.net - 列表(字符串)排序,数字升序,字母降序
【发布时间】:2015-10-12 14:01:24
【问题描述】:

我正在尝试将字符串列表排序为非常特殊的顺序。我有一个“X123XXX”格式的项目列表,其中 X 可以是字母,123 可以是任何数字。

Dim AList As New List(Of String)
AList.Add("B200")
AList.Add("A100X")
AList.Add("A100XY")
AList.Add("A100XYZ")

AList.Sort()

'Actual Return in order (AList(1).tostring etc.)
'A100X
'A100XY
'A100XYZ
'B200

'Desired Return
'A100XYZ
'A100XY
'A100X
'B200

我遇到的问题是,我不仅需要对数字升序和字母降序进行排序,而且还需要对第一个字母升序进行排序。

我希望这些部分始终采用相同的格式(字母 + 3 个数字 + 最多 3 个可选字母)——我可以只选择前 4 个并对该 ASC 进行排序,然后对最后 3 个进行 DESC 排序。但我不知道如何在 vb.net 中做到这一点。看了一圈,只能找到 IComparable 的东西,好像用处不大。

【问题讨论】:

  • 总是 3 个数字?我的意思是,1 个字母、3 个数字、X 个字母?
  • 是的,它们的开头总是有 3 个数字和 1 个字母。以后我可能不得不在 start 变量处设置字母,但现在不是。

标签: arrays vb.net list sorting


【解决方案1】:

你可以通过一些LINQ方法(OrderByThenBy等)得到你想要的;它们允许您执行所需的所有修改。

代码交付你想要的:

 AList = AList.OrderBy(Function(x) x.Substring(0, 1)).ThenBy(Function(x) Convert.ToInt32(x.Substring(1, 3))).ThenByDescending(Function(x) x.Substring(4)).ToList()

更新

上面的代码按字母降序排列最后一部分(即从第 5 位到结尾的字母);但显然 OP 希望根据字符串的长度执行最后一次排序(即最长的第一个和最短的最后一个)。以下代码提供了这样的行为:

AList = AList.OrderBy(Function(x) x.Substring(0, 1)).ThenBy(Function(x) Convert.ToInt32(x.Substring(1, 3))).ThenByDescending(Function(x) x.Substring(4).Length).ToList()

【讨论】:

  • @Thomas 你好。感谢您的 +1
  • @Feedel 它的工作原理完全符合我的理解,你希望它工作。即:根据最后一个子字符串(即从第 5 个位置到结尾),最后一个排序是按顺序执行的。在您的示例中:XYZ 是最大的,XY 是第二大的,X 是最小的。你到底想要什么?
  • @Feedel VFG, FK, K 不是正确的降序。正确的降序是:VFK、K 和 FK(交付我编写的代码的内容)。你到底想要什么?只是按字母数量排序?这也可以做到,但您必须明确定义您的期望。
  • @Feedel 没什么大不了的。我将在 1 分钟内更新我的答案。下次尝试确保您正确描述您的条件;一个例子通常是一个很好的主意,但有时例子并不能说明全部。
  • @Feedel 好了。在任何情况下,请记住我在这里做了一个例外:SO(至少,在我看来)不是为了提供按照提问者的确切要求工作的定制代码。我了解您想学习使用 LINQ 方法,这就是为什么我没有看到任何问题。但请在以后正确使用本网站(并写出明确的问题)。
【解决方案2】:

匿名函数的另一种方法,创建一个实现IComparer(Of String)的类:

Private Class CodeComparer
    Implements System.Collections.Generic.IComparer(Of String)

    Function Compare(ByVal a As String, ByVal b As String) As Integer _
             Implements IComparer(Of String).Compare
        Dim result As Integer = a.Substring(0, 4).CompareTo(b.Substring(0, 4))
        If result = 0 Then
            result = a.Substring(4).CompareTo(b.Substring(4)) * -1
        End If
        Return result
    End Function
End Class

这将按前 4 个字符按升序排序,然后按剩余字符按降序排序(因此是 * -1)。

然后您可以使用以下命令对列表进行排序:

items.Sort(New CodeComparer())

编辑:您还可以将相同的算法与传递给 Sort 方法的匿名函数一起使用。

items.Sort(Function(a, b)
               Dim result As Integer = a.Substring(0, 4).CompareTo(b.Substring(0, 4))
               If result = 0 Then result = a.Substring(4).CompareTo(b.Substring(4)) * -1
               Return tmp
           End Function)

【讨论】:

  • 使用此方法还可以使调试变得更容易(尤其是在 Visual Studio 中的调试器下运行时)。您可以添加断点并验证比较的逻辑。
猜你喜欢
  • 2018-01-14
  • 1970-01-01
  • 2013-06-05
  • 2022-01-10
  • 2018-03-24
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多