158

これは奇妙なことのように思えるかもしれませんが、それを無視すると、ディクショナリの各キーと値のペアがリストの各文字列である場所にを変換するList<string>ための簡潔な方法があります。Dictionary<string, string>すなわち

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

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

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

4

5 に答える 5

318

これを試して:

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")) ...
于 2012-07-20T14:11:59.810 に答える
17

これを使って:

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>>ため、各文字列インスタンスがその下にある個別のキーのリストが表示されます。

于 2012-07-20T14:12:06.717 に答える
7

編集

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

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
      }
    }
于 2012-07-20T14:13:52.910 に答える
1

を使用してToDictionary

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

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

于 2012-07-20T14:13:04.097 に答える