C# で Windows エクスプローラー風の並び順を実装する(StrCmpLogicalW と IComparer)
既定の文字列ソートでは "item10" が "item2" より前に並んでしまう。本記事では Win32 API の StrCmpLogicalW を P/Invoke で呼び出し、IComparer を実装したクラスとしてエクスプローラーに近い自然順ソートを実現する方法...
C# 言語と、その背後にある .NET ライブラリに関する記事の一覧です。 バージョンごとに追加された言語機能、新しい LINQ 演算子の .NET Framework へのバックポート、 複数のターゲットフレームワークをまたぐコードベースで問題になる互換性の詳細を扱います。
既定の文字列ソートでは "item10" が "item2" より前に並んでしまう。本記事では Win32 API の StrCmpLogicalW を P/Invoke で呼び出し、IComparer を実装したクラスとしてエクスプローラーに近い自然順ソートを実現する方法...
キーごとの集計で GroupBy が抱える中間グルーピングの割り当てコストを整理し、.NET 9 の CountBy・AggregateBy・Index を辞書への直接集計で .NET Framework に実装する方法と、GroupBy 委譲実装との挙動差を解説する。
SQL の LEFT JOIN / RIGHT JOIN に対応する .NET 10 の LeftJoin・RightJoin と Shuffle を .NET Framework へ実装し、GroupJoin イディオムとの対応関係、擬似シャッフルとの違い、IQuerya...
.NET 8 の ToDictionary 新オーバーロード(KeyValuePair 版・タプル版)を .NET Framework で再現する際に問われる、既存オーバーロードとの共存・名前付き引数による解決先の固定・notnull 制約の一致というシグネチャ設計を解説する。
既存の OrderBy への委譲だけで完結する Order・OrderDescending のポリフィルを題材に、戻り値型 IOrderedEnumerable が決める ThenBy 互換性と、環境によって異なるソート時例外という 2 つの互換性論点を解説する。
.NET Framework で Chunk・MaxBy・MinBy・DistinctBy を代用する GroupBy・全件ソートの回避イディオムを実行コストの面から検証し、計算量を改善するポリフィルの実装と、バージョン別シンボルによる移行ガードの選び方を解説する。
LINQ ポリフィル自作時の 3 つの設計原則(引数検証とイテレータの分離・バッファリングの最小化・条件付きコンパイルによる移行ガード)を、.NET Core 期に追加された Append・Prepend・TakeLast・SkipLast の実装を題材に解説する。
.NET Framework 環境では ??= などの C# 新構文が使用できない場合がある。本記事では C# 各バージョンで追加された演算子と初期化の糖衣構文をバージョン対応表とコード例とともに網羅的に整理する。
C# 14 の extension ブロックで Directory のような静的クラスを対象にすると、静的メンバーは追加できるがインスタンスメンバーは CS0721 / CS9303 で拒否される。レシーバーの書き方による境界と、インスタンス形式で呼びたい場合の代替手段を整...