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

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

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

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

Q&A

解決済

3回答

1321閲覧

配列の中身を分ける方法

maam

総合スコア55

C#

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

0グッド

0クリップ

投稿2019/01/25 11:09

VisualStudio2015を使用しています。
DataGridViewにデータを格納するために以下のようにループで回しています。

C#

1for(int cnt = 0; cnt<me.Count; cnt++ ) 2 { 3 dataGridView1.Rows.Add(me[cnt].Id,me[cnt].Name,me[cnt].Birthday,me[cnt].IsMan ? "男性" : "女性",me[cnt].PostCode, me[cnt].Adress); 4 } 5

PostCodeの7桁は「3桁―4桁」のようにハイフンで区切りたいです。
me[cnt].PostCode をどのように書き直せばよろしいでしょうか。
members[cnt].(PostCode.Substring(0,3))+ "-" + (PostCode.Substring(3,4))だと
”現在のコンテキストにPostCodeという名前は存在しません”とエラーになりました。

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

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

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

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

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

guest

回答3

0

me[cnt].PostCode.Substring(0,3) + "-" + me[cnt].PostCode.Substring(3,4)

投稿2019/01/25 11:16

otftrough

総合スコア476

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

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

maam

2019/01/28 03:51

ご回答ありがとうございます。 上記の通りにすると ”オブジェクト参照がオブジェクト インスタンスに設定されていません。” というエラーが出てしまうのですが、どうしてでしょうか。
papinianus

2019/01/28 05:35

PostCodeがnullなのでは?
maam

2019/01/28 05:41

はい、NULLがあるのでそうなるようです。NULLを許容すれば上記のコードで実行できるのでしょうか
papinianus

2019/01/28 05:44

そうです。それがZuishin様が書かれた?や??の意味です。 .の前の?はnullのときエラーを起こさず、以降の処理をやめてnullを返す機能 ??は??の前がnullだったときに、??の後ろを返り値にする機能です(三項(obj != null ? obj.ToString() : "")演算子を省略して書ける便利機能です)
maam

2019/01/28 05:51

そういうことなのですね!では、 (me[cnt]?.PostCode?.Insert(3, "-") ?? "") を 三項演算子で書くとどうなりますか??
Zuishin

2019/01/28 05:53

なんで三項演算子で書かなきゃいけないんでしょうか。 文法が覚えられないなら行数と変数と増やして泥臭くするのがいいでしょう。
maam

2019/01/28 05:59

三項演算子で…とお願いしたのは、三項演算子を採用するわけではなく 三項演算子の形とZuishinさんが教えてくださった形を照らし合わせて理解しようと思ったからです。すみません
Zuishin

2019/01/28 06:07

三つの演算子を使っているので書き換えると複雑で理解しにくくなります。papinianus さんの書かれた例で理解してください。それで十分理解できなければ私の貼ったリンク先を参照してください。
papinianus

2019/01/28 06:25

(me[cnt]?.PostCode?.Insert(3, "-") ?? "")をのところ、言い出しっぺですし、書いときます。 ??だけを三項演算子にするパターン me[cnt]?.PostCode?.Insert(3, "-") != null ? me[cnt]?.PostCode?.Insert(3, "-") : ""; ?.だけを展開するパターン ((me[cnt] != null && me[cnt].PostCode != null) ? me[cnt].Insert(3, "-") : null) ?? ""; 両方を合理的に合成したパターン (me[cnt] != null && me[cnt].PostCode != null) ? me[cnt].Insert(3, "-") : ""; ※単純に合成すると↓こうなりますが、こう書く人はいないと思います。 ((me[cnt] != null && me[cnt].PostCode != null) ? me[cnt].Insert(3, "-") : null) != null ? me[cnt].Insert(3, "-") : "";
maam

2019/01/29 00:09

ご丁寧にありがとうございました。
guest

0

ベストアンサー

正規表現ならこのように書きます。

C#

1Regex.Replace(me[cnt].PostCode, "(?<=^.{3})", "-")

^ は文字列の先頭、. は任意の一文字、{3} は直前のパターンの 3 回の繰り返し。合わせて ^.{3} は文字列の先頭から三文字にマッチします。
(?<=) は肯定的後読みアサーションで、= から ) までのパターンの最後の「位置」にマッチします。つまり (?<=^.{3}) で文字列の先頭から三文字目の後の「位置」にマッチします。
これを - に置換しているので、文字列の三文字目の後に - が挿入されます。

つまり次のように書くと

C#

1Regex.Replace("1234567", "(?<=^.{3})", "-")

123-4567 が得られます。

投稿2019/01/26 00:23

Zuishin

総合スコア28656

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

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

maam

2019/01/28 05:10

ご回答ありがとうございます。 Regexを初めて見たので自分がこれから使っていくことに慣れる自信がないのですが、substringを使って実現する方法はないでしょうか…
Zuishin

2019/01/28 05:28 編集

Substring を使うと煩雑になります。正規表現がダメならこれでどうでしょうか。 (me[cnt]?.PostCode?.Insert(3, "-") ?? "")
maam

2019/01/28 05:33

演算子’&&’を’string’と’string’型のオペランドに適用することはできません とエラーが出てしまいました…
Zuishin

2019/01/28 05:33

&& ではなく ?? です。書き間違えました。
papinianus

2019/01/28 05:36 編集

~~&&はどこから出て来たのでしょうか?~~ ↑理解しました。
Zuishin

2019/01/28 05:37

私のコメントで、現在は ?? となっているところですが、最初は && と書いていました。すぐに気が付いて書き直したのですが、間に合わなかったようです。
guest

0

-を入れるだけなら

C#

1me[cnt].PostCode.ToString().Insert(3, "-")

もありかと
(me[cnt].PostCodeがString型か不明でしたので一応ToStringしています)

投稿2019/01/28 05:32

YAmaGNZ

総合スコア10222

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

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

maam

2019/01/28 05:43

ご回答ありがとうございます。 オブジェクト参照がオブジェクト インスタンスに設定されていません。 とエラーがでましたが、どうすればよいでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問