LoginSignup
5
3

More than 5 years have passed since last update.

LINQのToDictonaryを覚えた

Last updated at Posted at 2019-02-03

ToDictionaryをMicrosoftのドキュメントで見てみると、

ToDictionary<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>)

って書いてある。が、俺には理解不能。

今回の記事の初期化

いかにも例題的なクラス

Employee.cs
class Employee
{
    /// <summary>
    /// 社員ID
    /// </summary>
    /// <remarks>プライマリキー</remarks>
    int Id { get; set; }

    /// <summary>
    /// 社員名
    /// </summary>
    string Name { get; set; }

    // 他のクラスメンバー略...
}

がある。

とある会社の全従業員をぶちこんだ、
List Employees; が存在する。

ここから、社員IDと社員名を列挙した、
Dictionary<int, string> EmployeeDictionary;
を作成する。
俺のコードをチェックする誰かを満足させるまでを書いた。

紆余曲折

最初はforで書いた


for(var i=0; i<Emploees.Count; i++)
{
    EmployeeDictionary.Add(Employees[i].Id, Employees[i].Name); 
}

次はforeachに書き直した

以前、
https://qiita.com/StaticProgramer/items/fab629ce838fb52ee814
で学んだ通り、まずforではアレだと言われるので、foreachに書き直す。

foreach (var employee in Employees)
{
    EmployeeDictionary.Add(employee.Id, employee.Name);
}

でも、これでは不合格だって言われたので。

KeyValuePair<int, string>を使えってことか?

// だめだ。よくわかんねぇ

悩むこと数分。

結論

そうか。LINQか。

EmployeeDictionary = Employees.ToDictionary(x => x.Id, x => x.Name);

1行で書けた。

番外編

苦闘中に書いた間違い作品。
てっきりKeyValuePairを使うんだと思ってたから。

// これじゃList<KeyValuePair> なんだぜ。。。
var dic = Employees.Select(x => { return new KeyValuePair<int, string>(x.Id, x.Name); }).Tolist();

// KeyにKeyは入ってるけど、ValueにKeyValuePairが入ってる気がした。
var dic2 = Employees.Select(x => { return new KeyValuePair<int, string>(x.Id, x.Name); }).ToDictionary(x => x.Key);
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3