C#の SortedList<TKey, TValue> ジェネリッククラスや SortedDictionary<TKey, TValue> ジェネリッククラスには、C++の std::map テンプレートクラスにあるメンバ関数 lower_bound や upper_bound に相当するメソッドがありません。
ではどうするのかというと、 .NET Framework 3.5 & C# 3.0 以降では IEnumerable<T> インタフェースに対する拡張メソッドである FirstOrDefault および LastOrDefault を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | - ! - | | | | | | | | | | | | | | | | | ! - - ! | | | | | | | | | | | | | ! | |
拡張メソッド FirstOrDefault は、条件に合致する(=引数のデリゲートが true を返す)最初の要素を返します。
拡張メソッド LastOrDefault は、条件に合致する(=引数のデリゲートが true を返す)最後の要素を返します。
いずれのメソッドも見つからなかった場合は要素型の既定値(上述のコードならば default(KeyValuePair<TKey, TValue>))を返します。
要素が存在するとわかっている場合には拡張メソッド First および Last も使えます。
こちらはリストが空である場合や要素が見つからなかった場合に例外をスローします。
なお、どのメソッドにもデリゲートを引数に取らないオーバロードがあり、そちらは単純にリスト内で一番最初および一番最後の要素を返します。