我想将字符串列表重新排序到不同的字符串列表中。我正在创建多个循环来执行此操作,但我想知道是否有更好的方法来执行此操作。
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
答案 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等订购。但我不知道这应该如何运作。
Contains
仅检查该行是否包含此子字符串,但您也可以在年份部分(例如,10年级)或其他地方使用此编号。因此,您的要求看起来容易出错并且含糊不清。
修改:如果文字与评论的样本一样严格,您可以将其简化为此,将每一行拆分为以逗号分隔的标记:
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()