1. ホーム
  2. c#

[解決済み] C# List<string> から Dictionary<string, string> への変換

2022-04-26 01:48:42

質問

これは奇妙なことに思えるかもしれませんが、それはさておき。 List<string> から Dictionary<string, string> ここで、Dictionaryの各Key Value PairはListの各文字列と同じです。

List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3

検索してみると、Stackoverflowだけでも文字通り何十もの逆方向の例があるのですが、この方法はないのです。

このようなことをする理由は、2つのサードパーツのコンポーネントがあり、それらを変更することは私の手には負えないからです。ひとつは、メールアドレスのリストを List<string> もう1つは、Toパラメータが Dictionary<string, string> . 辞書のキーはメールアドレスで、値は相手の本名です。しかし、本名はわからないが、メールアドレスに本名も設定すれば、まだ使える。したがって、なぜListを Dictionary<string, string> . この方法はいくらでもあります。A foreach 辞書にkvpを追加するリスト上のループ。しかし、私は簡潔なコードが好きなので、一行で済む解決策はないものかと考えていました。

どのように解決するのですか?

これを試してみてください。

var res = list.ToDictionary(x => x, x => x);

最初のラムダはキーを選び、2番目のラムダは値を選びます。

このように、キーと異なる値を作って遊ぶこともできます。

var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x));

リストに重複がある場合は Distinct() のようにします。

var res = list.Distinct().ToDictionary(x => x, x => x);

EDIT 有効な理由についてのコメントですが、このような変換で有効な理由は、ある時点で、結果の辞書のキーと値が乖離することだと思います。例えば、最初に変換を行い、その後、いくつかの値を別のものに置き換えるような場合です。もし、キーと値が 常に が同じになるようにする。 HashSet<String> を使えば、あなたの状況にもっとフィットするはずです。

var res = new HashSet<string>(list);
if (res.Contains("string1")) ...