2016-08-03 5 views
0

整数値とストリングを含むリストを取得しました。例インデックスによる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のを使用すると思います。何か案は?

+0

ここで 'DetermineDigits'とは何ですか? –

+0

それは、次の部分文字列がどこで始まるかを決める整数のリストです。 –

+1

私はあなたのコードを実行しました。そして、{{"Field1"、 "Field2"} 'を取り出しました。 2番目の文字列の先頭にはスペースがあり、3番目の文字列はありません。サンプル出力が必要なものか、または「どの作品」のコードが正しいかどうかを明確にしてください。 – Enigmativity

答えて

0

あなたはDetermineDigitsインデックスを反復するSelect()組み合わせるEnumerable.Range()を使用することができる:

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

最後のサブストリングの終了位置にあるDetermineDigitsposアレイが追加マインド。この追加がなければ、最後の部分文字列がなくなってしまいます。

また、Zip()を使用して、各部分文字列の{StartPos、EndPos}インデックスのリストを取得することもできます。


正規表現を使用して部分文字列を抽出することをお勧めします。

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

はNB:Imports System.Text.RegularExpressionsを追加することを忘れないでください、あなたの例では、これらは簡単にあなたが非常にコンパクトなコードになってしまいます簡単な\w+をつかんだことができます。

サブストリングパターンが複雑な場合は、正規表現をさらに詳しく説明します。

関連する問題