2016-08-03 30 views
0

Ich habe eine Liste mit Integer-Werten und einem String. Zum BeispielLinq Substring von Index

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

Ich möchte folgende Ausgabe erhalten:

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

versuchte ich

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 

, die funktioniert, aber ich würde lieber Linq verwenden. Irgendwelche Ideen?

+0

Was ist 'DetermineDigits' hier? –

+0

es ist die Liste der Ganzzahl, die bestimmt, wo der nächste Teilstring wird –

+1

starten Ich rut Ihren Code, den Sie sagen, funktioniert - und stieg '{" Field1 "," Field2 "}'. Es gibt ein Leerzeichen am Anfang der zweiten Zeichenfolge und keine dritte Zeichenfolge. Können Sie bitte klarstellen, ob die Beispielausgabe das ist, was Sie brauchen oder ob der "Was funktioniert" -Code korrekt ist? – Enigmativity

Antwort

0

können Sie Enumerable.Range() mit Select() kombiniert verwenden, um durch DetermineDigits Indizes iterieren:

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))) 

Mind the pos-Array, das die DetermineDigits mit der letzten Teilzeichen Endposition ist ihm hinzugefügt. Ohne diesen Zusatz fehlt Ihnen der letzte Teilstring.

Alternativ können Sie auch Zip() verwenden, um eine Liste der Indizes {StartPos, EndPos} für jeden Teilstring zu erhalten.


That being said Ich schlage vor, unter Berücksichtigung Regex zu verwenden, um Ihre Strings zu extrahieren. Diejenigen, die in Ihrem Beispiel lässt sich leicht packte mit einfachen \w+ so werden Sie mit sehr kompakten Code am Ende:

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

NB: nicht vergessen Imports System.Text.RegularExpressions hinzuzufügen.

Wenn Ihr Teilstringmuster komplexer ist, können wir die Regex weiter ausarbeiten.