0

ここでは、Split関数を使用して文字列の一部を取得しています。

string[] OrSets = SubLogic.Split('|');
foreach (string OrSet in OrSets)
{
  bool OrSetFinalResult = false;
    if (OrSet.Contains('&'))
    {
        OrSetFinalResult = true;
        if (OrSet.Contains('0'))
        {
            OrSetFinalResult = false;
        }
        //string[] AndSets = OrSet.Split('&');
        //foreach (string AndSet in AndSets)
        //{
        //    if (AndSet == "0")
        //    {
        //        // A single "false" statement makes the entire And statement FALSE
        //        OrSetFinalResult = false;
        //        break;
        //    }
        //}

    }
    else
    {
        if (OrSet == "1")
        {
            OrSetFinalResult = true;
        }
    }

    if (OrSetFinalResult)
    {
        // A single "true" statement makes the entire OR statement TRUE
        FinalResult = true;
        break;
    }
}

Split構造の置換とともに、操作を置換するにはどうすればよいですかforeach

4

3 に答える 3

1

アプリケーションのパフォーマンスを改善するために最適化する必要がある場合、string.Split メソッドではなく、foreach ループ内のコードを最適化する必要がある可能性があります。

[編集:]

最適化された文字列解析に関連する StackOverflow の他の場所には、多くの適切な回答があります。

String.Split() は、適切に最適化された方法で文字列を実際に分割するために、自分でできる以上のことを行う可能性があります。もちろん、これは、入力の分割セクションごとに true または false を返すことに関心があることを前提としています。それ以外の場合は、文字列の検索に集中できます。

他の人が述べたように、巨大な文字列 (数百メガバイト) を検索する必要があり、特に繰り返し継続的に検索する必要がある場合は、.NET 4 がTask Parallel Libraryで提供するものを見てください。

文字列を検索する場合、MSDN のこの例で、IndexOf、LastIndexOf、StartsWith、および EndsWith メソッドの使用方法を確認できます。これらは、Contains メソッドよりも優れたパフォーマンスを発揮するはずです。

もちろん、最善の解決策は、特定の状況の事実によって異なります。System.Diagnostics.Stopwatch クラスを使用して、実装 (現在の実装と新しい実装の両方) が最適なものを確認するのにかかる時間を確認します。

于 2011-12-14T05:22:31.827 に答える
1

仮説その1

プロセスの種類に応じて、作業を並列化できます。

var OrSets = SubLogic.Split('|').AsParallel();
foreach (string OrSet in OrSets)
{
  ...
  ....
}

ただし、これにより、マルチスレッド アプリで問題が発生することがよくあります (リソースのロックなど)。また、メリットも測定する必要があります。あるスレッドから別のスレッドに切り替えると、コストがかかる可能性があります。ジョブが小さい場合、AsParallel は単純なシーケンシャル ループよりも遅くなります。

これは、ネットワーク リソースやあらゆる種類の I/O に遅延がある場合に非常に効率的です。

仮説2

あなたの SubLogic 変数は非常に非常に大きいです

この場合、ファイルを順番にたどることができます:

class Program
{
    static void Main(string[] args)
    {
        var SubLogic = "darere|gfgfgg|gfgfg";

        using (var sr = new StringReader(SubLogic))
        {

            var str = string.Empty;
            int charValue;
            do
            {
                charValue = sr.Read();
                var c = (char)charValue;
                if (c == '|' || (charValue == -1 && str.Length > 0))
                {
                    Process(str);
                    str = string.Empty; // Reset the string
                }
                else
                {
                    str += c;
                }
            } while (charValue >= 0);

        }

        Console.ReadLine();
    }

    private static void Process(string str)
    {
        // Your actual Job
        Console.WriteLine(str);
    }

また、 間の各チャンクの長さによっては|、単純な文字列連結ではなく、StringBuilder を使用したい場合があります。

于 2011-12-14T05:31:11.770 に答える
0

を使用することで対処できる可能性がありますStringBuilderStringBuilder'|' が見つかるまで、ソース文字列から 1 文字ずつ読み取ってから、 a の内容を処理しStringBuilderます。これにより、大量のオブジェクトの作成を回避Stringし、多くのメモリを節約できます。

Java を使用したことがある場合は、StringTokenizerandStreamTokenizerクラスを使用することをお勧めします。.NET に同様のクラスがないのは残念です

于 2011-12-14T05:35:54.763 に答える