質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

974閲覧

C# 文字列を分割したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/06/05 12:35

編集2021/06/05 12:59

前提・実現したいこと

C# 文字列を分割する

文字列: "田中太郎,佐藤,次郎,山田三郎"
区切り文字:,

Splitメソッドで上記文字列を分割しようとしたところ出力が
・田中太郎
・佐藤
・次郎
・山田三郎
となりました。

実際に出したい出力は
・田中太郎
・佐藤次郎
・山田三郎
です。

ソースコード見れば自分でも当然だよねとは思うのですが、実現方法がわからず
検索もどんなワードで行えばヒットするかもわからなかったので質問させていただきました。

該当のソースコード

C#

1using System; 2 3namespace C_ 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 string names = "田中太郎,佐藤,次郎,山田三郎"; 10 string[] items = names.Split(","); 11 12 foreach (var item in items) 13 { 14 Console.Write(" " + item); 15 } 16 //実行結果 17 //田中太郎 佐藤 次郎 山田三郎 18 19 //やりたいこと 20 //田中太郎 佐藤次郎 山田三郎 21 } 22 } 23}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/06/05 12:38

どうやって「佐藤,次郎」は「佐藤次郎」であるべきと判断できるのでしょうか?
hope_mucci

2021/06/05 12:41

「佐藤」と「次郎」の間には"," が入っているので実行結果はそうなって当然です。(それはきちんと認識なさっているようですが) 条件付とタイトルに書かれていますが、 「佐藤,次郎」を","で分割しない条件は何でしょうか。 それが分からないと誰も答えらないと思います。
BeatStar

2021/06/05 12:54

佐藤と次郎の間にカンマ(,) があるので、質問にあるような結果になるのは明白です。 定義が曖昧すぎるので回答できません。
dodox86

2021/06/05 12:56

その条件すら、考えて教えて欲しいと言うご質問でしょうか。(そんな無茶な、と言う感じですが)
退会済みユーザー

退会済みユーザー

2021/06/05 12:57

申し訳ありません タイトル等で「条件付き」と記載してしまったのが良くないようです。 純粋に「佐藤」と「次郎」に分割されていた出力を「佐藤次郎」にしたいということです。
YAmaGNZ

2021/06/05 13:13

ですからどうやって「佐藤,次郎」は「佐藤次郎」であるべきと判断できるのでしょうか? 例えば「佐 藤」さんと「次 郎」さんがいた場合、「佐藤,次郎」が「佐藤」「次郎」となるのは正しいのではないですか?
hope_mucci

2021/06/05 13:16

佐藤と次郎が分割されている理由は何ですか? 田中太郎 と 山田三郎 が分割されていない理由は何ですか? 最低限この理由が分からないと何も解決法が出ません。
退会済みユーザー

退会済みユーザー

2021/06/05 13:35

私の内容を伝える力が乏しく、皆さまを困惑させてしまい、申し訳ありませんでした。 ベストアンサーの方に答えていただいた内容がやりたかったことです。 「佐藤,次郎」は「佐藤次郎」であるべきと判断できるのでしょうか?、 田中太郎 と 山田三郎 が分割されていない理由は何ですか?ということについて プログラミングの授業の課題で出された問題で、 ・佐藤次郎だけ分割されているのはそういうもの ・田中太郎、鈴木次郎、山田三郎の三人の名前がある という前提が自分の中ではありました。 今後、質問を行う場合は誤解、困惑を生まないように 自分の脳内の情報は全て記入するようにします。
Zuishin

2021/06/05 13:55

授業の課題ということなら、このベストアンサーの回答は間違っていると思います。
退会済みユーザー

退会済みユーザー

2021/06/05 23:34

> プログラミングの授業の課題で出された問題で、 ならばここで聞くことがまず間違いですよ。先生、講師に聞くべきです。 読んでください→ https://teratail.com/help/question-tips そこに書いてありますが、 人に質問をするには、自分が何を尋ねたいかを知っている必要があります。 これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです。 ・・・ができることが、ここのような文章でやり取りするサイトで質問 するには最低限必要と認識してください。
退会済みユーザー

退会済みユーザー

2021/06/06 02:48

ゆとり教育の成果(?)というやつでしょうか、こういう人が多いように感じる今日この頃・・・
guest

回答3

0

とりあえずそれっぽく動いた答えが貰えたので即退会して逃げていますが、
学校の課題を質問サイトで質問した際に出題者が考えを回答として投稿した件

まず,Yahoo!知恵袋のようなナレッジサービスにレポートを質問を投げることはacqua_aquilaさんの自由ですが,その程度によっては不正行為と認定され単位取り消しなどの処分の対象になるリスクがあることにご注意ください.

※引用の為、リンク先の質問者のユーザー名が表示されていますがご了承ください

学校の課題を答えをもらおうと思って質問することはリスクがある行為であり、将来的な面においても何の役にも立たないことであると書いておきます
卒業さえすればプログラムにかかわらないのでどうでも良いというのであれば、そもそも学科やコースの選択自体お金と時間の無駄です。将来やりたい仕事にかかわる内容を勉強できるように移籍しましょう

卒業後に仕事に就きたいというのであれば、そもそもプログラムは正解を導く学問ではないという事を理解してください。答えは要件や規約に合致した挙動が出来ればどんなやり方でもOKです
この要件や規約というのは質問者にはわかっていることでも回答者にはわからないことです
なので同じような感じで質問サイトに投稿すれば良いやなどと考えているとあなたのコードだけバグを生んだりコードレビューで弾かれたりします
そしてなんでそう書いたのか理解していなければ対応できません
となると仕事は任せられないことからプログラマーとして仕事できなくなります
派遣会社に所属(もしくは多重派遣をごまかすための準委任契約と言ってる営業が多いですがそれも同じです)している場合は派遣先から切られます
どこに行っても即切られる場合はあなたの会社も仕事できない人に給料を払い続けることは無理ですので、やめてくれと言ってくるでしょう
それでも在籍し続ける場合は解雇となることもありうるでしょう
会社を変えても同じです

これが社内での開発だともっと悲惨です
プログラムが出来ないと分かった段階でそれでも自分と同じ給料をもらってる同僚が居たら皆さんはどういう気持ちになるでしょうか?
そしてその感情が向かうのはあなたです

投稿2021/06/06 03:03

len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、『どのようになればいいのでしょうか』。

いくら、佐藤と次郎が一つだと仮定しても、プログラムを処理するのはあくまで機械(コンピュータ)です。

人間ですらその場合によるのですから、『こうやればいい』っていうことはあり得ません。

ですが、『条件によっては可能』です。

たとえば、『必ず三文字以上から成り、二文字以下なら次の単語と一つと見なす』とかです。

"佐藤" は二文字ですね。

よって、次の単語である"次郎" と連結して、"佐藤次郎"とするとか。

ただし、中国系の方だと、一文字だったり、姓名両方合わせても二文字しかない方もいらっしゃいます。

そういうものにも耐えうるものを作るとなると、もうちょっと仕様を練らないといけません。

英語圏だと、一文字から二文字はあり得ないとしても、"John Smith" (日本だと『山田太郎』とかみたいな) とかのように、『半角スペース』が入ります。

そういうのをどうやって判別するのでしょうか。

まずは『仕様を明確にしましょう』です。

これを疎かにするなら、どんな天才でもできません。
だって、「問題文を読まずに問題を解くようなもの」ですから。

なので実務では仕様書とかを作るのです。(開発モデルによってはそこまで厳格じゃない場合もあるが)

それと、プログラミングは『こう書けばいい』……というものじゃないです。

プログラムは魔法でもなんでもなく、人間が現実世界でやっていることを逐一指示されながら処理しているだけの代物である』です。

つまり、私達人間がやっている手順を、C#とかの独自の書き方やクラス、メソッド等を使って表現しているだけにすぎません。

よって、『現実世界でならどうするか』を考えてみるのです。

今回の場合、仮に『常に三文字以上から成り、二文字以下であれば次の単語と連結する』であれば、

私なら、

1. 文字列分割をする (→ 配列 tmp に入れておく) 2. 配列 tmp にデータがある間 2.1. 長さが2以下( Length < 2 ) なら 2.1.1. 次( i + 1 ) のデータと連結し 2.1.2. 結果用の配列に追加 2.2. (それ以外なら) 2.2.1. 連結せずにそのまま結果用の配列に追加

のようにしますね。

これをC#ならC#の書き方やメソッド等を使って実装するだけです。
(もちろん、デバッグやらなんやらはする必要があるが)


[追記1]

後もう一つヒントを。

プログラミングは『こう書けばいい』っていうものじゃないので、まずは『現実世界でならどうするか』を考えることです。

ですがここでさらにアドバイスを。

『規則性』、『言い換え』をやってみるといいいです。

今回の場合、『常に三文字以上から成り、二文字以下であれば次の単語と連結する』とかです。

そうすると、後はコードに落とし込むだけになります。

言い換えは、たとえば、FizzBuzz問題での『3の倍数なら』とかです。

「3の倍数とは何か」
-> 「3で割り切れる数字である」
-> では「3で割り切れる」とは何か
-> (3で割り切れるものと、割り切れないものを列挙する)
-> 3で割ったときの余りが0である
==> したがって、「3で割ったときの余りが0かどうか」でわかる

と言う風に。

プログラミングが出来る人はこういう、言い換えや規則性を見付けるのが得意です。(得意とまでは行かなくとも「好き」であることが多い)

投稿2021/06/05 13:21

編集2021/06/05 13:56
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/05 13:42

ありがとうございます。 『仕様を明確にしましょう』、『プログラムは魔法でもなんでもなく、人間が現実世界でやっていることを逐一指示されながら処理しているだけの代物である』ということを意識せずに適当にコードを書いてわからないから質問した結果が追記・修正依頼で反映されたのでしょう。 今後、自分の中で仕様を明確にしてから質問するようにします。
guest

0

ベストアンサー

純粋に「佐藤」と「次郎」に分割されていた出力を「佐藤次郎」にしたいということです。

ということであれば、

C#

1string names = "田中太郎,佐藤,次郎,山田三郎"; 2names = names.Replace("佐藤,次郎","佐藤次郎"); 3string[] items = names.Split(","); // 田中太郎 佐藤次郎 山田三郎

とすれば取得できますが、こういうことでいいんでしょうか?

投稿2021/06/05 13:12

yuuyu

総合スコア1139

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/05 13:31

わかりづらい質問文から、回答をいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問