入力された一連の値を要約する関数を Linq を使用して作成したいと思います。関数は次のようになります。
IDictionary<TKey, Summary<TKey>> Summarize<TKey, TValue>(IEnumerable<TValue> values)
{
return values
.ToLookup(val => GetKey(val)) // group values by key
.Union(*an empty grouping*) // make sure there is a default group
.ToDictionary(
group => group.Key,
group => CreateSummary(group)); // summarize each group
}
問題は、着信シーケンスにそのキーの値が含まれていない場合でも、結果の IDictionary に default(TKey) のエントリが必要であるということです。これは純粋に機能的な方法で行うことができますか? (変更可能なデータ構造を使用していません。)
私が考えることができる唯一の方法は、辞書にパイプする前にルックアップで .Union を呼び出すことです。しかし、それには空の IGrouping を作成する必要があり、これは明示的なクラスなしでは可能ではないようです。これを行うエレガントな方法はありますか?
編集: TKey は値型であると想定できます。