web-dev-qa-db-ja.com

C#リスト<string>を辞書<string、string>に変換します

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

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

私はたくさんの検索を行いましたが、Stackoverflowだけで逆方向に実行することはできますが、この方法ではないという文字通り数十の例があります。

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

98
Jonnster

これを試して:

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有効な理由についてコメントするには、このような変換に有効な唯一の理由は、結果のディクショナリのキーと値が分岐することだと思います。たとえば、最初の変換を行ってから、値の一部を別の値に置き換えます。キーと値がalwaysが同じになる場合、HashSet<String>があなたの状況により良く適合します:

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

これを使って:

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>>と同じであるため、その下にある各文字列インスタンスを持つ個別のキーのリストがあります。

10
Daniel Hilgarth

ToDictionary を使用して:

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

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

1
Lukazoid

次を使用できます。

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

編集

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

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
      }
    }
0
Pranay Rana