将String列表重新排序为新列表

时间:2012-03-29 14:39:43

标签: vb.net

我想将字符串列表重新排序到不同的字符串列表中。我正在创建多个循环来执行此操作,但我想知道是否有更好的方法来执行此操作。

        Dim values As New List(Of String)

    For Each val As String In vals

        If val.Contains("10") And val.Contains("Year 1") Then

            values.Add(val)

        End If

    Next

    For Each val As String In vals

        If val.Contains("20") And val.Contains("Year 1") Then

            values.Add(val)

        End If

    Next

有很多这样的循环可以做我想要的任何人可以提供任何帮助或更好的方法去做这个?请注意,我希望值列表返回10,10,10,20,20,20,以便首先添加10行,然后添加20行。

感谢,

的Stefan

2 个答案:

答案 0 :(得分:0)

Dim values As List(Of String) = vals.OrderBy(Function(s)
         If s.Contains("Year 1") Then
             If s.Contains("10") Then Return 0
             If s.Contains("20") Then Return 1
         End If
         Return Integer.MaxValue
    End Function).ToList()

听起来您可能还想为此字符串创建正则表达式,以拉出您关心的字段。这应该会使这个表现更好。为了帮助您正确表达,我们需要更多地了解字符串的外观。

答案 1 :(得分:0)

如果您希望按年份订购,这将有效:

Dim result = (From item In values
      Where item.ToLower Like "*year #*"
      Let year = Regex.Match(item.Substring(item.ToLower.IndexOf("year ")), "\d+").Value
      Order By year).ToList()

但是你已经说过你想要它按10,20,30等订购。但我不知道这应该如何运作。

  1. 该值可能是8,25,4711而是如何在String中找到它?
  2. Contains仅检查该行是否包含此子字符串,但您也可以在年份部分(例如,10年级)或其他地方使用此编号。
  3. 因此,您的要求看起来容易出错并且含糊不清。

    修改:如果文字与评论的样本一样严格,您可以将其简化为此,将每一行拆分为以逗号分隔的标记:

    Dim result = (From item In values
              Let Tokens = item.Split({","c}, StringSplitOptions.RemoveEmptyEntries)
              Let Count = Int32.Parse(Tokens(3))
              Let Year = Int32.Parse(Regex.Match(Tokens(5), "\d+").Value)
              Order By Count, Year
              Select item).ToList()