5

次の文字列があります。

string source = "Test/Company/Business/Department/Logs.tvs/v1";

文字は、文字列内のさまざまな要素間の/区切り文字です。文字列の最後の 2 つの要素を取得する必要があります。この目的のために、次のコードがあります。これはうまくいきます。これのためのより高速でシンプルなコードはありますか?

コード

    static void Main()
    {
        string component = String.Empty;
        string version = String.Empty;
        string source = "Test/Company/Business/Department/Logs.tvs/v1";
        if (!String.IsNullOrEmpty(source))
        {
            String[] partsOfSource = source.Split('/');
            if (partsOfSource != null)
            {
                if (partsOfSource.Length > 2)
                {
                    component = partsOfSource[partsOfSource.Length - 2];
                }

                if (partsOfSource.Length > 1)
                {
                    version = partsOfSource[partsOfSource.Length - 1];
                }
            }
        }

        Console.WriteLine(component);
        Console.WriteLine(version);
        Console.Read();
    }
4

7 に答える 7

4

なぜ正規表現がないのですか?これはかなり簡単です:

.*/(?<component>.*)/(?<version>.*)$

グループにラベルを付けることもできるので、試合のために必要なことは次のとおりです。

component = myMatch.Groups["component"];
version = myMatch.Groups["version"];
于 2013-01-23T16:40:23.410 に答える
3

以下、2つを見つけるために必要なだけの文字列のみをスキャンし、文字列/全体を分割する必要がないため、より高速です。

string component = "";
string version = "";
string source = "Test/Company/Business/Department/Logs.tvs/v1";
int last = source.LastIndexOf('/');
if (last != -1)
{
    int penultimate = source.LastIndexOf('/', last - 1);
    version = source.Substring(last + 1);
    component = source.Substring(penultimate + 1, last - penultimate - 1);
}

とはいえ、すべてのパフォーマンスに関する質問と同様に、プロファイルです! 実際の入力の大きなリストで 2 つを並べて試し、どちらが最速かを確認してください。

(また、これは、入力にスラッシュがない場合は例外をスローするのではなく、空の文字列を残します...ただしsource、null の場合はスローします。怠惰です。)

于 2013-01-23T16:41:18.210 に答える
2

あなたのコードはほとんど問題ないように見えます。注意すべき点がいくつかあります。

  1. String.Split()null を返すことはないため、null チェックは必要ありません。
  2. source文字列が 2 文字未満の場合/、どのように対処しますか? (元の投稿はこれに対処するために更新されました)
  3. ソース文字列が null または空 (または無効) の場合、本当に空の文字列を出力したいですか? 入力の性質について特定の期待がある場合は、それらの期待が満たされない場合は、すぐに失敗することを検討してください。
于 2013-01-23T16:37:29.927 に答える
2

特定のインデックスで部分文字列を探している場合、あなたのアプローチは最も適しています。この場合、LINQ 式で同じことを行っても、コードや読みやすさは向上しない可能性があります。

参考までに、文字列と LINQ の操作に関するMicrosoft からの優れた情報がいくつかあります。特に、LINQ と RegEx の両方でいくつかの例をカバーしている記事を参照してください。

編集:+1 正規表現アプローチ内のマットの名前付きグループの場合...これは私が見た中で最も優れたソリューションです。

于 2013-01-23T16:41:14.380 に答える
1

このようなことを試すこともできますが、はるかに高速になるとは思えません。System.Diagnostics.StopWatch を使用していくつかの測定を行い、必要性を感じているかどうかを確認できます。

string source = "Test/Company/Business/Department/Logs.tvs/v1";

int index1 = source.LastIndexOf('/');
string last = source.Substring(index1 + 1);

string substring = source.Substring(0, index1);
int index2 = substring.LastIndexOf('/');
string secondLast = substring.Substring(index2 + 1);
于 2013-01-23T16:42:38.900 に答える
1

私は試してみます

        string source = "Test/Company/Business/Department/Logs.tvs/v1";

        var components = source.Split('/').Reverse().Take(2);

        String last = string.Empty;

        var enumerable = components as string[] ?? components.ToArray();
        if (enumerable.Count() == 2)
            last = enumerable.FirstOrDefault();
        var secondLast = enumerable.LastOrDefault();

これが役立つことを願っています

于 2013-01-23T17:31:56.950 に答える
-1

以下のプロセスを使用して、最後の 2 つの単語を取得できます。

string source = "Test/Company/Business/Department/Logs.tvs/v1";

 String[] partsOfSource = source.Split('/');
if(partsOfSourch.length>2)
 for(int i=partsOfSourch.length-2;i<=partsOfSource.length-1;i++)
console.writeline(partsOfSource[i]);
于 2013-01-24T11:20:02.923 に答える