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