2013-01-13 14 views
5

デリミタ文字列と分割するテキストを受け入れるString.Splitのオーバーロードがない有効な理由はありますか?その後、なぜ文字列がありませんか。Split(string)overload?

string input = "This - is - an - example"; 
string[] splitted = input.Split(" - "); 
// results in: 
// { "This", "is", "an", "example" } 

のように使用することができ

string[] Split(string delimiter) 

私は本当に簡単に拡張子メソッドを作成することができることを、知っているが、これが追加されていない理由を正当な理由がなければなりません。

文字列区切り文字を使用して文字列を分割する方法を探しているわけではありませんが、私はむしろそのようなオーバーロードが問題を引き起こす理由を探しています。これは本当に問題が起きるとは思わないので、初心者の方でなぜ簡単なstringの代わりに実際にstring[]を区切り文字として渡す必要があるのか​​を理解するのは難しいです。

+3

私が想像一見単純なメソッドをいくつでも追加することができますが、それはあなたが指摘しているように、拡張メソッドを使って独自のメソッドを追加することができる理由です。 – glosrob

+0

回答からわかるように、この質問に対する回答は得られません。私の推測*は、テスト対象が何らかの形で問題に遭ったユーザビリティスタディと関係があると思われます。おそらく、Char対Stringのオーバーロードを適切に処理できないためです。 .NETフレームワークのデザイナーだけが正確に答えてくれますが、ここには投稿しません。 –

+1

@HansPassant私はこのことについて[Eric Lippert](http://stackoverflow.com/users/88656/eric-lippert)に連絡してくれました。 – GameScripting

答えて

3

を見て)とString []引数?あなたの質問に対する答えを提供するかもしれません。

実際には、文字を1つ受け入れるString.Split()オーバーロードはありません。オーバーロードにはChar []が使用されますが、これはパラメータ配列であるため、単一の文字で呼び出すことができ、暗黙的にChar []にキャストされます。例えば

"1,2,3,4,5".Split(','); 

は、あなたが渡すことによって、分割呼び出すことができるでしょうString []型の単一の引数を受け入れスプリット()のオーバーロードがあった場合

"1,2,3,4,5".Split(new[] { ',' }); 

と同じスプリット()オーバーロードを呼び出し、単一の文字列引数。

ただし、String []をSplitに渡すときには、オーバーロードは存在せず、StringSplitOptionsは必須です。なぜStringSplitOptionsが強制的なのかについては、私は理論化しかできませんが、文字列で分割する場合、アルゴリズムを複雑に分割する可能性が大幅に増加する可能性があります。これらの場合に期待される結果を提供するためには、互いに隣接する複数の区切り文字を見つけるときのメソッドの振る舞いを定義することが望ましい。すなわちStringSplitOptionsは必須です。

あなたはSplit(String, StringSplitOptions)過負荷を持っている可能性がありますが、イリヤ・イワノフは、上記の回答で述べたように、あなたがどこかに停止する必要があり、単一の文字列を渡すのに最適な方法があることを主張するかもしれない。

+0

最初の回答は私の質問を扱っており、良いこともあります。ありがとう。 – GameScripting

+2

['StringSplitOptions'](http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx)は実際にはそれほど高度ではなく、唯一のメンバーは' None'と 'RemoveEmptyEntries'です。 – CodeCaster

-2
string input = "This - is - an - example"; 
string[] splitted = Regex.Split(input," - "); 
foreach (string word in splitted) 
{ 
    MessageBox.Show(word); 
} 

それだけではなく、スペースの問題で、それはexatclyあなたstring区切り文字にマッチしています、のstring.Splitを(呼び出すときに、なぜStringSplitOptionsパラメータ義務がある」と疑問を微調整

string input = "This,- is,- a,- complicated,- example"; 
string[] splitted = Regex.Split(input,",- "); 
foreach (string word in splitted) 
{ 
    MessageBox.Show(word); 
} 
+1

'Regex'は' String.Split'と[正規表現についてでなければ 'Regex'を使うべきではありません](http://stackoverflow.com/a/2234376/808723)よりも遅いです。 – GameScripting

+1

@GameScriptingあなたが提供したリンクは正規表現についてではない場合、Regexを使用してはならない理由を説明していません。 – Default

+0

@Defaultコメントを見てください。彼らはまったく同じことを述べています。私は、文字列を分割するための 'Regex'の使用は、正規表現についての注意点があるので、[さらなる開発者を混乱させるかもしれません](http://stackoverflow.com/a/1257322/808723)と思います。 – GameScripting

関連する問題