按索引排列的Linq子字符串



我得到了一个包含整数值和字符串的列表。例如

DetermineDigits = {1,8,16,24}
String = "|Field1, Field2; Field26"

我想得到以下输出:

Dim output as List(Of String) = Feld1
                                Feld2
                                Feld3

我试过

For i = 1 To DetermineDigits.Count - 1
    Dim NoOfDigits As Integer = DetermineDigits(i) - DetermineDigits(i - 1) - 1
    tmpStr = String.Substring(DetermineDigits(i - 1), NoOfDigits)
    list.add(tmpStr)
Next

这是有效的,但我宁愿使用Linq。有什么想法吗?

您可以使用Enumerable.Range()Select()来迭代DetermineDigits索引:

Dim DetermineDigits = {1, 8, 16}
Dim Str = "|Field1, Field2; Field26"
Dim pos = DetermineDigits.Concat(New Integer() {Str.Length}).ToArray()
Dim output = Enumerable.Range(1, pos.Count() - 1) _
    .Select(Function(i) Str.Substring(pos(i - 1), pos(i) - pos(i - 1)))

请注意pos数组,它是添加了最后一个子字符串结束位置的DetermineDigits。如果没有添加,则相当于丢失了最后一个子字符串。

或者,您可以考虑使用Zip()来获得每个子字符串的{StartPos,EndPos}索引列表。


话虽如此,我建议考虑使用regex来提取子字符串。使用简单的w+可以很容易地获取示例中的代码,因此您最终会得到非常紧凑的代码:

Dim Str = "|Field1, Field2; Field26"
Dim output = Regex.Matches(Str, "w+").Cast(Of Match)().Select(Function(m) m.Value).ToList()

注意:别忘了添加Imports System.Text.RegularExpressions

如果您的子字符串模式更复杂,我们可以进一步详细说明正则表达式。

最新更新