1

初めてのプログラムを書いていますが、実行速度が遅いことがわかりました。あるテキスト形式を別の形式に変換するために使用されます。その際、特定の文字列を検索し、そこからテキストを解析する必要があることがよくあります。これは次のようになります。

const string separator = "Parameters Table";

 // Get to the first separator
var cuttedWords = backgroundWords.SkipWhile(x => x != separator).Skip(1);      

// Run as long as there is anything left to scan

while (cuttedWords.Any())
{
    // Take data from the last found separator until the next one, exclusively
    var variable = cuttedWords.TakeWhile(x => x != separator).ToArray();

    // Step through cuttedWords to update where the last found separator was
    cuttedWords = cuttedWords.Skip(variable.Length + 1);

    // Do what you want with the sub-array containing information


} 

同じことを行うためのより効率的な方法があるかどうかを知りたいです (つまり、文字列を検索し、その文字列と次の同一の文字列の間のサブ配列でやりたいことを行います)。ありがとうございました。

4

3 に答える 3

1

最も簡単な方法は、文字列を分割することです。

const string separator = "Parameters Table";
var text = "ThisParameters TableisParameters TableaParameters Tabletest";
var split = text.Split(new[] { separator }, StringSplitOptions.None);
foreach(var x in split)
{
    // do something
}

これが機能しない理由はありますか?

于 2013-06-10T14:25:52.253 に答える
1

次のようなより直接的なものはどうでしょうか。

var startIndex = backgroundWords.IndexOf(separator) + separator.Length;
var endIndex = backgroundWords.IndexOf(separator, startIndex);
var cuttedWords = backgroundWords.Substring(startIndex, endIndex);

そして、あなたはそのようにそれを切り続けることができます. 前進したいときは、これを行うことができます:

// note I added the endIndex + separator.Length variable here to say
// continue with the end of what I found before
startIndex = backgroundWords.IndexOf(separator, endIndex + separator.Length) + separator.Length;
endIndex = backgroundWords.IndexOf(separator, startIndex);
cuttedWords = backgroundWords.Substring(startIndex, endIndex);

したがって、変更されたコード スニペットは次のようになります。

const string separator = "Parameters Table";

var startIndex = backgroundWords.IndexOf(separator) + separator.Length;
var endIndex = backgroundWords.IndexOf(separator, startIndex);
var cuttedWords = backgroundWords.Substring(startIndex, endIndex);

while (cuttedWords.Any())
{
    // Take data from the last found separator until the next one, exclusively
    var variable = cuttedWords.TakeWhile(x => x != separator).ToArray();

    // Step through cuttedWords to update where the last found separator was
    cuttedWords = cuttedWords.Skip(variable.Length + 1);

    startIndex = backgroundWords.IndexOf(separator, endIndex + separator.Length) + separator.Length;
    endIndex = backgroundWords.IndexOf(separator, startIndex);
    cuttedWords = backgroundWords.Substring(startIndex, endIndex);
}
于 2013-06-10T14:01:42.867 に答える