C# の Dictionary と F# の map

ちょっと気になったのでメモ書き

C# の Dictonary は referencesource/mscorlib/system/collections/generic/dictionary.cs にあって、buckets[hashCode % buckets.Length] な形でハッシュ値で計算。

F# の map は fsharp/src/fsharp/FSharp.Core/map.fs にあって、comparer を使って二分木

ちなみに C# の SortedDictionary は referencesource/System/compmod/system/collections/generic/sorteddictionary.cs にあって、TreeSet<KeyValuePair<TKey, TValue>> な二分木で計算。

ReadOnlyDictonary ってのもある。 ここ にソースがあるので見ると、dictonary を渡しているだけなので、中身は一緒。追加用のメソッドがないだけ。同じように ReadOnlyCollection があるけど、内部的には IList と同じ。なので、非同期に特化しているとか、分散されているとか、という訳ではないらしい。逆に言えば、初期化するときに分散に特化させたリストを渡せば、表面上は ReadOnlyCollection として扱える。Add メソッドなどを呼び出すと、実行時にエラーが発生する(メソッド自体をなくしてしまって、コンパイル時にエラーにする、ってのでもいいかもしれない)。

 

 

カテゴリー: 開発 パーマリンク