C#Convert List <string> to Dictionary <string、string>


117

これを実行するのは奇妙に思えるかもしれませんが、それを無視すると、リストを辞書に変換する簡潔な方法があり、辞書の各キーと値のペアはリストの各文字列にすぎません。すなわち

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

私はたくさんの検索を行いましたが、Stackoverflowだけで文字通り数十の例があり、逆方向にそれを行っただけですが、この方法ではありません。

これを行う理由は、3つの部分からなるコンポーネントが2つあり、それらを変更することは私の手に負えないからです。1つはメールアドレスのリストをリストとして返し、もう1つはToパラメータがディクショナリであるメールを送信します。辞書のキーはメールアドレスで、値は本名です。ただし、実名はわかりませんが、実名をメールアドレスに設定しても機能します。したがって、なぜリストを辞書に変換したいのですか?これを行う方法はたくさんあります。リストにkvpを追加するforeachループ。しかし、私は簡潔なコードが好きで、単一行の解決策があるかどうか疑問に思いました。


1
正直なところ、私にはあなたの正当な理由により良い解決策があります。

2
Dictionary <、>を使用する代わりに、HashSet <>が要件を満たしているかどうかを確認したい場合があります。
グレッグ

上記のコメンターよりも直接的に:これを希望する理由を説明すると、誰かがおそらくより良い解決策を提案できます。
Tim S.

1
これ以上の解決策はありません。これらはメールアドレスである文字列のリストを返すサードパーティのコンポーネントがあります。電子メールを送信する別のサードパーティコンポーネントがあり、Dictionary <string、string>を渡します。キーは電子メールアドレスで、値は受信者の実際の名前です。ただし、実際の名前をメールアドレスにすることもできます。そのため、List <string>をDictionary <string、string>に変換します
Jonnster

回答:


243

これを試して:

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);

編集有効な理由についてコメントするには、このような変換に有効である可能性がある唯一の理由は、ある時点で、結果のディクショナリのキーと値が分岐することです。たとえば、最初の変換を行ってから、一部の値を別の値に置き換えます。キーと値が常に同じにHashSet<String>なる場合は、状況によりよく適合します。

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

リストがstring1、string2、string3、string1のような場合、これは失敗します
Pranay Rana

3
@PranayRanaはい、そうです。これを回避するために.Distinct()listから追加できます。
dasblinkenlight 2012

ありがとう。ToDictionary機能がありませんでした。基本的に同じ答えを出したすべての人に感謝します。私はみんなに賛成票を投じましたが、1つの回答しか受け入れることができません。これはDistinctコードが追加された1つだけなので、私の意見では最も完全でした。
Jonnster

11

これを使って:

var dict = list.ToDictionary(x => x);

詳細については、MSDNを参照してください。

Pranayがコメントで指摘しているように、アイテムがリストに複数回存在する場合、これは失敗します。
特定の要件に応じて、var dict = list.Distinct().ToDictionary(x => x);個別のアイテムの辞書を取得するために使用するか、ToLookup代わりに使用することができます。

var dict = list.ToLookup(x => x);

これはILookup<string, string>と本質的に同じを返すIDictionary<string, IEnumerable<string>>ので、その下に各文字列インスタンスを持つ個別のキーのリストがあります。


リストがstring1、string2、string3、string1のような場合、これは失敗します
Pranay Rana

1

を使用してToDictionary

var dictionary = list.ToDictionary(s => s);

任意の文字列が繰り返される可能性がある場合は、Distinct最初にリストで呼び出しを行うか(重複を削除する)、またはToLookupキーごとに複数の値を許可するを使用します。


0

以下を使用できます。

var dictionary = myList.ToDictionary(x => x);

0

編集

重複を処理する別の方法は、このようにすることができます

var dic = slist.Select((element, index)=> new{element,index} )
            .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element);

または


簡単な方法は

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

しかし、文字列が繰り返されていないことを確認してください...そうでなければ、上記のコードは機能しません

文字列がある場合は、このようにする方が良いです

Dictionary<string,string> dic= new Dictionary<string,string> ();

    foreach(string s in Stringlist)
    {
       if(!dic.ContainsKey(s))
       {
        //  dic.Add( value to dictionary
      }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.