質問: Discord.Netにてプログラミングをしている者です。 スペースがあってもすべて検索に回せるようなコードがわからず、質問させていただきます。 語彙力が足らず、どの様な意味かわからない方もいらっしゃるかと思いますため、例としてMusic BotのRythmの様なものを思い浮かべていただければと思います。 `Ex: !p いきものがかり ありがとう` -> これは"いきものがかり ありがとう"で検索され、その候補が再生されるようになっています。 ですが↓で採用しているコードでは矢印の通り1つ目の引数にしか対応しないため、too meny parametersでエラーを吐いて終わってしまいます。 これは引数指定を2つにすれば解決する話なのですが、これが3,4,5...と増えていくとコードとして書くのはとても面倒くさいことになってしまうと考えています。 ですのでどうにかして一つの引数にスペースを含めてすべて変数に代入してしまいたいと考えているのです。 方法をご教授ください。 採用しているコード ``` public async Task Taskname(string search) // ↑ここのみにしか対応しないため、スペースを含めるとtoo many parametersとなります { } ``` 説明が足りておりませんが、よろしくお願いします。
回答: もう少し詳しい説明とすれば、以下の記事に3つの方法が書かれています。 その中の3つ目がパラメータに`[Remainder]`属性を指定しておく、というものです。 Parameters with Spaces > > To accept a space-separated list, set the parameter to `params Type[]`. > > > Should a parameter include spaces, the parameter **must** be wrapped in quotes. For example, for a command with a parameter `string food`, you would execute it with `!favoritefood "Key Lime Pie"`. > > > If you would like a parameter to parse until the end of a command, flag the parameter with the RemainderAttribute. This will allow a user to invoke a command without wrapping a parameter in quotes. > > > **スペースのあるパラメータ** > > スペースで区切られたリストを受け入れるには、パラメータを`params Type[]`に設定します。 > > > パラメータにスペースが含まれる場合は、パラメータを引用符で囲む **必要があります** 。例えば、パラメータに`string food`を指定したコマンドの場合、`!favoritefood "Key Lime Pie"`と実行します。 > > > コマンドの最後まであなたがパラメーターを解析したい場合は、`Remainder Attribute`を使用してパラメーターにフラグを立てます。これにより、ユーザーはパラメーターを引用符で囲むことなくコマンドを呼び出すことができます。 > > > 1つ目と3つ目がBot側の対処方法ですね。2つ目はBotを呼び出す側の対処となります。 どの方法を選ぶかは作成者の好みでしょうか。 Bot側で空白を意識していったん区切る処理とかが必要ならば、1つ目の方法にしておくのが良さそうです。 単にエコーバックやリレー通知するだけなら3つ目でしょうね。 あとこの記事によれば、パラメータの途中に指定すれば、それまでは解析してそれぞれのパラメータに格納し、それ以後は解析せずにひと続きの文字列として扱うということのようです。 What does [Remainder] do in the command signature? > > The `RemainderAttribute` leaves the string unparsed, meaning you don't have to add quotes around the text for the text to be recognized as a single object. Please note that if your method has multiple parameters, the remainder attribute can only be applied to the last parameter. > > > `RemainderAttribute`は文字列を解析せずに残します。つまり、テキストを単一のオブジェクトとして認識するためにテキストを引用符で囲む必要はありません。 メソッドに複数のパラメーターがある場合、残りの属性は最後のパラメーターにのみ適用できることに注意してください。 > > >