31

各文字をループして目的の文字かどうかを確認する代わりに、次のようにインデックスをリストに追加します。

     var foundIndexes = new List<int>();
     for (int i = 0; i < myStr.Length; i++)
     {
        if (myStr[i] == 'a')
           foundIndexes.Add(i);
     }
4

7 に答える 7

27

を使用できますString.IndexOf。以下の例を参照してください。

    string s = "abcabcabcabcabc";
    var foundIndexes = new List<int>();

    long t1 = DateTime.Now.Ticks;
    for (int i = s.IndexOf('a'); i > -1; i = s.IndexOf('a', i + 1))
        {
         // for loop end when i=-1 ('a' not found)
                foundIndexes.Add(i);
        }
    long t2 = DateTime.Now.Ticks - t1; // read this value to see the run time
于 2012-10-07T03:29:19.770 に答える
10

どうですか

string xx = "The quick brown fox jumps over the lazy dog";

char search = 'f';

var result = xx.Select((b, i) => b.Equals(search) ? i : -1).Where(i => i != -1);
于 2012-10-07T03:14:24.543 に答える
7

生の反復は常により良く、最も最適化されています。

少し複雑なタスクでない限り、より最適化されたソリューションを探す必要はありません...

だから私は続けることをお勧めします:

var foundIndexes = new List<int>();

for (int i = 0; i < myStr.Length; i++)

     if (myStr[i] == 'a') foundIndexes.Add(i);
于 2012-10-07T03:23:11.487 に答える
5

文字列が短い場合は、文字列を 1 回検索して文字の出現回数を数え、そのサイズの配列を割り当てて文字列を 2 回検索し、配列にインデックスを記録する方が効率的な場合があります。これにより、リストの再割り当てがスキップされます。

結局のところ、文字列の長さと文字の出現回数です。文字列が長く、文字が数回出現する場合は、一度検索してインデックスを a に追加するList<int>方が高速です。文字が何度も出現する場合は、文字列を 2 回検索する (1 回はカウントするため、1 回は配列を埋めるため) 方が高速な場合があります。転換点がどこにあるかは、質問から推測できない多くの要因によって異なります。

複数の異なる文字の文字列を検索し、それらの文字のインデックスのリストを個別に取得する必要がある場合は、文字列を一度検索してDictionary<char, List<int>>(またはList<List<int>>文字オフセットをインデックス\0として外部配列に使用して)を構築する方が高速な場合があります。 .

最終的には、アプリケーションのベンチマークを行ってボトルネックを見つける必要があります。多くの場合、パフォーマンスが遅いと思われるコードが実際には非常に高速であり、ほとんどの時間を I/O またはユーザー入力のブロックに費やしています。

于 2012-10-07T03:22:33.543 に答える