1

小さな問題があります。私はさまざまなプロバイダー(私は制御できません)からのキーワード文字列に取り組んでおり、それらはすべて異なる形式で文字列を送信します。

文字列内のキーワードは、コンマ、セミコロン、スペース、またはタブで区切ることができます。1つの文字列では、1種類の区切り文字のみが使用されます。

どのようにそれを認識しますか?

私は(擬似コード)のようなものを考えていました:

string delimiters = { ",",";"," " };

var x = str.split(delimiters[0]).count();

var y = str.split(delimiters[1]).count();

var z = str.split(delimiters[2]).count();

次に、どれが最大かを確認して使用します。

もっと良いアイデアを知っていますか?

4

4 に答える 4

1

なぜだめですか:

var result = str.Split(new[] {',', ';', ' '}, StringSplitOptions.None);

編集:

var result = delimiters.Select(d => str.Split(d))
            .OrderByDescending(l => l.Count())
            .First();
于 2012-10-02T10:26:21.810 に答える
1

あなたのアイデアは完璧に機能しますが、より良い解決策は、拡張メソッドを作成し、次のようにジャグ配列を返すことだと思います。

public static class Utilities {
    public static string[ ][ ] MultipleSplit( this string s, char[ ] delimiters ) {
        string[][] result = new string[ delimiters.Length ][ ];
        for ( int i = 0; i < delimiters.Length; i++ )
            result[ i ] = s.Split( delimiters[ i ] );

        return result;
    }

    public static string[ ] Larger( this string[ ][ ] jaggedArray ) {
        int index_larger = 0;

        for ( int i = 0; i < jaggedArray.Length; i++ ) {
            if ( jaggedArray[ i ].Length > jaggedArray[ index_larger ].Length )
                index_larger = i;
        }
        return jaggedArray[ index_larger ];
    }
}

そして、次のように使用します。

string[][] result = str.MultipleSplit(delimiters);
string[] larger = result.Larger();
于 2012-10-02T10:29:28.090 に答える
0

正規表現で分割してみてください。その正規表現は[、;\s]になります。これにより、コンマ、セミコロンスペース、またはタブが検索されます。

于 2012-10-02T10:26:03.513 に答える
0

ここでの提案は受け入れられ、現在のニーズを満たしていますが、根本的な問題は

これはさまざまなプロバイダー(私は制御できません)からのものであり、それらはすべて異なる形式で文字列を送信します。

情報を受け入れる方法について、さまざまなプロバイダーとの何らかの形の「契約」または合意が必要です。それぞれが異なっていても、システムは誰がデータを送信しているかを判断し、正しいパーサーを選択できます。

現在のオプションのどれも提供していないことの1つは、適切なデータを確保する方法です。提出されたデータが悪い場合はどうなりますか?どのようにあなたは知っていますか?データが悪いかどうかは重要ですか?

于 2012-10-02T10:30:58.853 に答える