0

これはいくつかの異なる方法で尋ねられましたが、私は別の開発者と「私の方法」と「あなたの方法」について議論しています。言語はC#です。

各チャンクの最初の 2 文字がタグであるパイプ区切り文字列を解析したいと考えています。

ルール。私のルールではなく、私に与えられた、守らなければならないルールです。文字列の形式を変更できません。この関数は何度も呼び出される可能性があるため、効率が重要です。シンプルに保つ必要があります。私が探している入力文字列とタグは、実行時に変更される可能性があります。

入力文字列の例: AOVALUE1|ABVALUE2|ACVALUE3|ADVALUE4 値が必要な可能性があるタグの例: AB

区切り文字に基づいて文字列を配列に分割し、関数が呼び出されるたびに配列をループします。次に、最初の 2 文字を見て、最初の 2 文字を引いた値を返します。

「他の人」の方法は、文字列を取得し、IndexOf と SubString の組み合わせを使用して、探しているフィールドの開始点と終了点を見つけることです。次に、SubString を再度使用して、値から最初の 2 文字を引いた値を引き出します。したがって、彼は IndexOf("|AB") を文字列内の検索と次のパイプと言うでしょう。これが始まりと終わりになります。次に、SubString を出力します。

ここで、IndexOf と SubString は毎回文字レベルで文字列を解析するので、大きなチャンクを使用して文字列から最初の 2 文字を差し引いたものを読み取るよりも効率が悪いと考えるべきです。それとも、私たち二人が提案したものよりも優れた別の方法はありますか?

4

4 に答える 4

2

入力文字列を毎回再評価する必要があることを考えると、他の人のアプローチは時間の経過とともにより効率的になります。入力文字列が長い場合、文字列の分割に必要な余分なメモリも必要ありません。

非常にタイトなループをコーディングしようとしている場合は、追加のオーバーヘッドを回避するために、LINQ ではなく配列/文字列演算子を直接使用することを好みます。

string inputString = "AOVALUE1|ABVALUE2|ACVALUE3|ADVALUE4";

static string FindString(string tag)
{
    int startIndex;
    if (inputString.StartsWith(tag))
    {
        startIndex = tag.Length;
    }
    else
    {
        startIndex = inputString.IndexOf(string.Format("|{0}", tag));
        if (startIndex == -1)
            return string.Empty;

        startIndex += tag.Length + 1;
    }

    int endIndex = inputString.IndexOf('|', startIndex);
    if (endIndex == -1)
        endIndex = inputString.Length;

    return inputString.Substring(startIndex, endIndex - startIndex);
}
于 2012-12-04T01:49:36.167 に答える
1

私はC#で多くの解析を行ってきましたが、使用されるリソースが少し軽くなり、少し速くなる可能性があるという理由だけで、おそらく「他の人」によって提案されたアプローチを取るでしょう。

とはいえ、データが大きすぎない限り、最初のアプローチに問題はなく、プログラミングがはるかに簡単になります。

于 2012-12-04T01:29:47.620 に答える
0

このようなものはうまくいくかもしれません

string myString = "AOVALUE1|ABVALUE2|ACVALUE3|ADVALUE4";
string selector = "AB";

var results = myString.Split('|').Where(x => x.StartsWith(selector)).Select(x => x.Replace(selector, ""));

戻り値:一致のリスト、この場合は1つの「VALUE2」のみ

あなたが最初のまたは唯一の一致を探しているなら、これはうまくいくでしょう。

 string result = myString.Split('|').Where(x => x.StartsWith(selector)).Select(x => x.Replace(selector, "")).FirstOrDefault();
于 2012-12-04T01:34:07.357 に答える
0
  • SubString は文字列を解析しません。
  • IndexOf は文字列を解析します。

私の好みは、主にコードコーディングの効率である Split メソッドです。

string[] inputArr = input.Split("|".ToCharArray()).Select(s => s.Substring(3)).ToArray();

かなり簡潔です。substring/indexof メソッドは LoC をいくつ使用しますか?

于 2012-12-04T01:35:40.090 に答える