2016年8月27日土曜日

LinqでListからDictionaryへ変換

ListからDictionaryへ変換


ListからDictionaryを作成する場合に、foreachで回してDictionaryを作成したりしていませんか?(そもそも、最初からDictionaryで確保すればいいんですけど、、、どうしようもなくなっている場合もあると思います。)

C#3.0で追加されたLinqを使えば、簡単に変換することができるようになります。 まず、重複しない文字列のリストがあるとします。
var ballList = new List()
{ "ball","superball","hyperball" };
そのリストから文字列の長さをDictonaryのValueとして保持する形を作るときに、 foreachを使用すると以下のようになります。

 var ballDics = new Dictionary();  foreach(var ball in ballList){    ballDics.Add(ball, ball.Length);}

ただし、処理の途中で、上記のようなコードがあると、Dictonary化したいという意図が伝わらないため、コードの可読性が落ちます。(メソッド化すれば別ですが・・・)
 ただし、Linqを使用することで、以下のように簡単に記載することができます。

 var ballDics = ballList.ToDictionary(val => val, val => val.Length);

上記では、文字列をValueとして入れていますが、構造体配列の一部をキーとしてDictionary化するのに役立つと思います。

public struct Data
{
    public String Name;
    public UInt32 Age;
    public UInt32 Weight;
    public UInt32 Height;
};
private void Convert()
{
    var dataList = new List<Data>()
    {
        new Data(){Name="Suzuki", Age=20,Weight=50,Height=160 },
        new Data(){Name="Tanaka", Age=30,Weight=60,Height=170 },
        new Data(){Name="ito",    Age=40,Weight=70,Height=180 },
        new Data(){Name="sato",   Age=40,Weight=70,Height=180 },
    };
    var dics = dataList.ToDictionary(data => data.Name);
}

0 件のコメント:

コメントを投稿