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

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

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

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

Q&A

3回答

14276閲覧

Dictionary<string, string>をToString()で一覧にしたい

short

総合スコア13

C#

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

0グッド

0クリップ

投稿2017/11/07 05:06

こんにちは。
Visual Studio 2017 Communityを使ってプログラミングしています。
OSはWindows10です。

###前提・実現したいこと
Dictionary<string, string>をToString()で一覧にしたいです。

出力。stringで。
猫\tcat\r\n
アビシニアン\tabyssinian\r\n

C#

1Dictionary<string, string> 翻訳辞書s = new Dictionary<string, string>(); 2翻訳辞書s.Add("猫", "cat"); 3翻訳辞書s.Add("アビシニアン", "abyssinian");

###試したこと
拡張メソッドで実装すればよいのかと思って調べました。
List<string>なら、
http://kamiya.hatenadiary.jp/entry/2014/03/11/023140
にありました。

###該当のソースコード

public static string JoinString<T>(this IEnumerable<T> values, string glue, Func<T, string> converter = null) { if (converter != null) return string.Join(glue, values.Select(converter)); else return string.Join(glue, values); }

###参考に作ったソースコード

public static string JoinString<Key, Value>(this Dictionary<Key, Value> values, string glue) { return (string.Join(glue, values.Keys) + string.Join(glue, values.Values); }

###発生している問題・エラーメッセージ
この場合、
1)classnameは何にする?
2)namespaceは何にする?
3)呼び出すのは
Dictionary<string, string> 翻訳辞書s = new Dictionary<string, string>();
翻訳辞書s.JoinString(this, "\t");
でよいでしょうか?

拡張メソッド初めてなので、かなり的外れかもしれません。
よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2017 Community 15.3.3
.NET Framework 4.7.02053
Windows10 home

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

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

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

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

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

guest

回答3

0

ToJsonを作ると便利。Json.netを入れてね。

public static string ToJson(this object obj) { return JsonConvert.SerializeObject(obj, Formatting.Indented); }

1)classnameは何にする?

2)namespaceは何にする?
3)呼び出すのは

1 拡張メソッドなので、静的クラスであればなんでもいい
2 なんでもいい。常識的なものがいい
3 はじめの、using に加える

投稿2017/11/07 05:11

編集2017/11/07 05:20
kiichi54321

総合スコア1984

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

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

short

2017/11/07 08:56

ありがとうございます。 まずはJson.Netを使わない方法を知りたいです。
guest

0

C#

1using System; 2using System.Collections.Generic; 3 4namespace Sample 5{ 6 public static class Program 7 { 8 public static void Main(params string[] args) 9 { 10 Dictionary<string, string> 翻訳辞書s = new Dictionary<string, string>(); 11 12 翻訳辞書s.Add("猫", "cat"); 13 翻訳辞書s.Add("アビシニアン", "abyssinian"); 14 15 foreach (KeyValuePair<string, string> item in 翻訳辞書s) 16 { 17 Console.WriteLine(item.Key + "\t" + item.Value); 18 } 19 } 20 } 21}

やりたいことを古臭いやり方でやるとこうなるかと。
拡張メソッドはラムダ式が出来てからいらない子に近くなってきたので、そのやり方はあまりオススメ出来ません。

投稿2017/11/07 10:10

tak458

総合スコア16

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

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

short

2017/11/14 02:59

回答遅くなりました。この方法はできるので、ステップアップを考えています。 拡張メソッドはラムダ式が出来てからいらない子に近くなってきたんですか。 ではラムダ式を勉強したほうがいいのかも。アドバイスもらえたらうれしいです。
tak458

2017/11/14 05:49 編集

拡張メソッド自体は良い技術なので必要ですが、あまり乱用するとコードの可読性を下げてしまうのでオススメできません。また、ラムダ式などで充分置き換えられますし、慣れればその方が読みやすいです。 あと拡張メソッドを勉強したからと言ってその後必要になるかといえば、、疑問です。もちろん言語の深い所まで勉強したい方には必要ですが。 ラムダ式でforeach節を書き換えるとこうなります。 ``` var lines = 翻訳辞書s.Select(a => $"{a.Key}\t{a.Value}"); // 省略前:翻訳辞書s.Select(item => { return item.Key + "\t" item.Value; }); Console.WriteLine(String.Join(Environment.NewLine, lines)); ``` といっても突然すぎるのでその前段階にこんな感じにしています。 ``` List<string> result = new List<string>(); foreach (KeyValuePair<string, string> item in 翻訳辞書s) { result.Add(item.Key + "\t" + item.Value); } Console.WriteLine(string.Join(Environment.NewLine, result)); ``` あ、markdown使えないんですね。。。脳内変換お願いします^^;
short

2017/11/14 08:53

ありがとうございます。じっくり試します。少しお時間ください。
guest

0

素直に書くとこう

public static string ToText<Key, Value>(this Dictionary<Key, Value> dic) { StringBuilder sb = new StringBuilder(); foreach(var item in dic) { sb.AppendLine($"{item.Key.ToString()}¥t{item.Value.ToString()}") } return sb.ToString(); }

string.Joinを使うならこんな感じ

public static string JoinString<Key, Value>(this Dictionary<Key, Value> dic, string glue) { return string.Join(glue,  dic.Select(item=> $"{item.Key.ToString()}¥t{item.Value.ToString()}") ; }

VS で書いていないので間違いがありそうだけど。

ToStringで出すのは、Dictionaryをオーバーライドしないとだめで、面倒が増えるだけなのでなしですね。

投稿2017/11/07 10:01

kiichi54321

総合スコア1984

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問