レシピ集シリーズC#コードレシピ集

書籍の概要

この本の概要

C#を使いこなすための,究極のレシピ集。
基礎から高度な文法,開発現場で使えるテクニックまで余すところなく集めました。
基本文法/数値演算/例外処理/LINQ/クラス/インターフェイス/リフレクション……参照しやすいようにわかりやすく整理。
「どんなコードを書けば思い通りに動くんだろう?」がスグに解決。
駆け出しエンジニアから開発者まで,C#を使うすべての方にお届けします。
C# 9.0,.NET 5.0対応。

こんな方におすすめ

  • C#の初級者~中級者
  • C#を使ってアプリケーションやゲームなどを開発する方

この書籍に関連する記事があります!

書きたいコード,どうやって調べる?
新しく「プログラミングを勉強したい!」と思ったとき,皆さんはまず何から手をつけるでしょうか?

本書のサンプル

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

サンプル画像3

目次

Chapter 1 基本文法

  • 001 様々な型のローカル変数を宣言したい
  • 002 constキーワードで定数を利用したい
  • 003 文字列リテラルで改行コードやタブコードを記述したい
  • 004 逐語的リテラル文字列を利用したい
  • 005 文字列補間を使い文字列を整形したい
  • 006 if文で条件分岐処理を書きたい
  • 007 if文で多分岐処理を書きたい
  • 008 switch文で多分岐処理を書きたい
  • 009 AND ORなどの条件論理演算をしたい
  • 010 条件に応じて値を変えたい(条件演算子?:)
  • 011 ある値を他の型に型変換(キャスト)したい
  • 012 for,while,do-while文で繰り返し処理を記述したい
  • 013 foreachでコレクションの要素を順に処理したい
  • 014 繰り返しの途中で処理をスキップし次の繰り返しに移りたい
  • 015 繰り返し処理を中断したい

Chapter 2 数値演算

  • 016 数値の加減乗除および剰余を求めたい
  • 017 インクリメント演算子(++),デクリメント演算子(--)を使いたい
  • 018 intやdoubleの最小値,最大値を求めたい
  • 019 絶対値を求めたい
  • 020 べき乗を求めたい
  • 021 切り捨て,切り上げをしたい
  • 022 指定した位置で切り捨て,切り上げをしたい
  • 023 四捨五入したい
  • 024 数値演算時のオーバーフローを検知したい
  • 025 ふたつの浮動小数点数が等しいか比較したい
  • 026 ランダムな値を生成したい
  • 027 ビット演算をしたい
  • 028 Nビット目をOn/Offしたい
  • 029 Nビット目の状態を調べたい

Chapter 3 文字列処理

  • 030 文字列を数値に変換したい
  • 031 数値を文字列に変換したい
  • 032 書式を指定して整数を文字列に変換したい
  • 033 数値を桁数を指定して文字列化したい
  • 034 文字列がnullまたは空文字列であるか調べたい
  • 035 文字列の中に指定した部分文字列があるか調べたい
  • 036 文字列が指定した文字列で開始/終了しているかを調べたい
  • 037 ふたつの文字列の先頭N文字が一致しているかを調べたい
  • 038 大文字小文字を区別せずにふたつの文字列を比較したい
  • 039 文字列の両端にある空白を取り除きたい
  • 040 文字列の中で指定した部分文字列が最初に現れる位置を求めたい
  • 041 文字列から部分文字列を取得したい
  • 042 文字列から指定した範囲の文字を取り除きたい
  • 043 文字列の一部を別の文字列に置き換えたい
  • 044 指定した位置に文字列を挿入したい
  • 045 文字列を大文字あるいは小文字に変換したい
  • 046 文字列の中の各文字を1文字ずつ操作したい
  • 047 指定した文字数になるまで文字列の先頭に空白を埋め込みたい
  • 048 文字列を指定した区切り文字で分割したい
  • 049 StringBuilderを使い複数の文字列を高速に連結したい
  • 050 StringBuilderを使い文字列の置換処理をしたい
  • 051 文字列補間内でエスケープ文字を無効にしたい
  • 052 コレクションの要素を指定した区切り文字で連結したい
  • 053 文字列と文字配列を相互変換したい
  • 054 文字列とbyte配列を相互変換したい
  • 055 サロゲートペア文字に対応した文字列処理を行いたい
  • 056 カルチャに依存しない文字列比較を行いたい

Chapter 4 日付時刻処理

  • 057 本日の日付や現在の時刻を取得したい
  • 058 DateTimeオブジェクトから年月日時分秒ミリ秒を取り出したい
  • 059 曜日を取得したい
  • 060 N日後,N日前を求めたい
  • 061 Nか月後,Nか月前を求めたい
  • 062 ふたつの日時を比較したい
  • 063 うるう年かどうか調べたい
  • 064 1月1日からの年間積算日を求めたい
  • 065 指定した月の月末日を求めたい
  • 066 ふたつの日時の差を求めたい
  • 067 日付文字列をDateTime型に変換したい
  • 068 日付,時刻を様々な書式で文字列化したい
  • 069 和暦の元号と年を求めたい
  • 070 元号を表す序数から元号(文字列)を求めたい
  • 071 日付を和暦表示したい
  • 072 カルチャを指定して日時を文字列化したい

Chapter 5 コレクション

  • 073 配列を利用したい
  • 074 コレクションの要素を順に取り出したい
  • 075 配列の要素を同じ値で埋めたい
  • 076 配列の順序を逆順にしたい
  • 077 配列の順序を昇順に並べ替えたい
  • 078 Comparison<T>を使用して配列を並べ替えたい
  • 079 2次元配列を使いたい
  • 080 ジャグ配列を使いたい
  • 081 List<T>を使いたい
  • 082 List<T>を宣言と同時に初期化したい
  • 083 List<T>に複数の要素を一度に追加したい
  • 084 List<T>から条件に一致した要素を削除したい
  • 085 List<T>の要素の順序を反転させたい
  • 086 List<T>の要素を昇順に並べ替えたい
  • 087 Comparison<T>を使用してList<T>を並べ替えたい
  • 088 List<T>内を高速にサーチしたい
  • 089 ForEachメソッドですべての要素を順に処理したい
  • 090 List<T>を読み取り専用にしたい
  • 091 Dictionary<TKey,TValue>を利用したい
  • 092 Dictionary<TKey,TValue>内のすべてのキーを参照したい
  • 093 HashSet<T>を利用したい
  • 094 HashSet<T>で集合演算を行いたい
  • 095 Stack<T>を利用したい
  • 096 Queue<T>を利用したい

Chapter 6 クラスと構造体の基礎

  • 097 クラスを定義したい
  • 098 プロパティを定義したい
  • 099 読み取り専用プロパティを定義したい
  • 100 プロパティに初期値を設定したい
  • 101 バッキングフィールドを利用したプロパティを定義したい
  • 102 メソッドを定義したい
  • 103 同名のメソッドを複数定義(オーバーロード)したい
  • 104 可変長引数を持つメソッドを定義したい
  • 105 メソッドを式形式で簡潔に書きたい
  • 106 コンストラクターを定義したい
  • 107 複数のコンストラクターを定義したい
  • 108 クラスを継承したい
  • 109 静的クラスを定義したい
  • 110 構造体を定義したい
  • 111 匿名型を使いたい
  • 112 オブジェクトを複製したい

Chapter 7 列挙型

  • 113 列挙型を定義したい
  • 114 列挙型に定義されている値をすべて列挙したい
  • 115 列挙型と数値を相互に変換したい
  • 116 列挙型と文字列を相互に変換したい
  • 117 指定した値が列挙型で定義されているか判断したい
  • 118 Flags属性で列挙型をビットフラグとして扱いたい

Chapter 8 nullを扱う

  • 119 null許容値型を利用したい
  • 120 null合体演算子でnullのときだけ別の値にしたい
  • 121 null条件演算子でnullチェックを省略したい
  • 122 null条件演算子とnull合体演算子を同時に使いたい
  • 123 null合体割り当て演算子でnullのときに値を変更したい
  • 124 null許容参照型を利用したい

Chapter 9 LINQ

  • 125 条件に該当する要素だけ取得したい(Where)
  • 126 クエリの結果を新しい型に変換したい(Select)
  • 127 ある位置までの要素を取得したい(Take/TakeWhile)
  • 128 ある位置まで要素をスキップしたい(Skip/SkipWhile)
  • 129 最初の要素を取得したい(First/FirstOrDefault)
  • 130 最後の要素を取得したい(Last/LastOrDefault)
  • 131 指定した位置の要素を取得したい(ElementAt)
  • 132 重複する値を取り除きたい(Distinct)
  • 133 シーケンスの要素の順序を反転したい(Reverse)
  • 134 データを並べ替えたい(OrderBy/OrderByDescending)
  • 135 特定の型だけを取得したい(OfType)
  • 136 シーケンスの先頭/末尾に要素を追加したい(Prepend/Append)
  • 137 シーケンス内の要素数を求めたい(Count)
  • 138 合計を求めたい(Sum)
  • 139 最小値,最大値を求めたい(Min/Max)
  • 140 平均値を求めたい(Average)
  • 141 すべての要素が条件を満たしているかどうかを調べたい(All)
  • 142 いずれかの要素が条件を満たしているかどうかを調べたい(Any)
  • 143 指定した要素がシーケンスに含まれているか調べたい(Contains)
  • 144 シーケンスを配列やList<T>に変換したい(ToArray/ToList)
  • 145 ディクショナリに変換したい(ToDictionary)
  • 146 HashSet<T>に変換したい(ToHashSet)
  • 147 指定したキーでグルーピングしてILookup<K,E>に変換したい
  • 148 和集合を求めたい(Union)
  • 149 積集合を求めたい(Intersect)
  • 150 差集合を求めたい(Except)
  • 151 指定したキーに基づいて結果をグループ化したい(GroupBy)
  • 152 関連のあるふたつのシーケンスをひとつにまとめたい(Join)
  • 153 ふたつのシーケンスの要素を関連付けその結果をグループ化したい(GroupJoin)
  • 154 階層構造になったオブジェクトのシーケンスを平坦化したい(SelectMany)
  • 155 ふたつのシーケンスを連結したい(Concat)
  • 156 ふたつのシーケンスの対になる要素をタプルのシーケンスに変換したい(Zip)
  • 157 ふたつのシーケンスが等しいかを調べたい(SequenceEqual)
  • 158 指定した範囲の数値コレクションを生成したい(Range)
  • 159 指定した値を繰り返すシーケンスを生成したい(Repeat)
  • 160 特殊な集計処理を行いたい(Aggregate)
  • 161 複数のLINQメソッドを連結させたい
  • 162 LINQで外部結合を行いたい

Chapter 10 例外処理と後処理

  • 163 例外処理を記述したい
  • 164 複数の例外に対応したい
  • 165 例外情報にアクセスしたい
  • 166 例外を発生させたい
  • 167 例外を再スローしたい
  • 168 例外オブジェクトに独自のデータを追加したい
  • 169 InnerExceptionプロパティを再帰的にたどりたい
  • 170 独自例外を定義したい
  • 171 例外処理で例外フィルターを使い対象例外を絞りたい
  • 172 条件演算子やnull合体演算子とともに例外を発生させたい
  • 173 try-finallyで確実に後処理をしたい
  • 174 using文で確実にDisposeメソッドを呼び出したい
  • 175 using宣言を使い,より簡単にusing文を書きたい

Chapter 11 より高度なクラスの定義

  • 176 ラムダ式を受け取るメソッドを定義したい
  • 177 インデクサを定義したい
  • 178 イベントを定義し利用したい
  • 179 拡張メソッドでクラスを拡張したい
  • 180 LINQ to Objectsに対応した拡張メソッドを定義したい
  • 181 演算子をオーバーロードしたい
  • 182 独自の型でキャスト式を利用可能にしたい
  • 183 動的にプロパティを追加できるdynamicクラスを作りたい
  • 184 レコード型で安全性を高めたい

Chapter 12 ジェネリックとインターフェイス

  • 185 ジェネリッククラスを定義したい
  • 186 ジェネリックメソッドを定義したい
  • 187 インターフェイスを定義したい
  • 188 インターフェイスに既定の動作を定義したい
  • 189 既定のインターフェイスメソッドを上書きしたい
  • 190 yield構文を使いIEnumerable<T>を返すメソッドを定義したい
  • 191 IEquatable<T>インターフェイスを持つクラスを定義したい
  • 192 IEqualityComparer<T>インターフェイスを実装したい
  • 193 IComparable<T>インターフェイスを実装し大小比較したい
  • 194 IComparer<T>インターフェイスを実装してソートしたい
  • 195 IDisposableインターフェイスを実装したい
  • 196 オブザーバーデザインパターンを実装したい

Chapter 13 よりスマートにコードを書く

  • 197 最上位レベルステートメントを使いたい
  • 198 クラス名を省略してメソッドを呼び出したい
  • 199 nameof式でシンボルの名前の間違いをなくしたい
  • 200 defaultキーワードでオブジェクトの既定値を指定したい
  • 201 new式でインスタンス生成のコードを簡略化したい
  • 202 out変数で引数宣言を簡略化したい
  • 203 メソッド呼び出しで名前付き引数を使用したい
  • 204 switch式を利用したい
  • 205 switch文のcaseラベルに条件を付加したい
  • 206 is演算子でパターンマッチングを使いたい
  • 207 ローカル関数を定義したい
  • 208 プロパティのgetアクセサー,setアクセサーを式形式で書きたい
  • 209 init専用セッターでクラスの安全性を高めたい
  • 210 メソッドでタプルを利用しふたつの値を返したい
  • 211 配列でより高度なインデックス操作をしたい
  • 212 dynamic型を使いたい

Chapter 14 並列処理と非同期処理

  • 213 BackgroundWorkerクラスを利用してバックグラウンドで処理を動かしたい
  • 214 awaitを使用して非同期メソッドを呼び出したい
  • 215 同期メソッドを非同期メソッドに変更したい
  • 216 Taskクラスで起動したタスクを最大N秒まで待ちたい
  • 217 指定した時間だけ処理を待機させたい
  • 218 Taskをキャンセルしたい
  • 219 Parallelクラスを使用して並列処理をさせたい
  • 220 PLINQで並列処理をしたい
  • 221 PLINQで並列処理の結果の順序を制御したい
  • 222 PLINQで並列処理の結果に対しても並列処理したい
  • 223 PLINQで例外処理を記述したい
  • 224 複数のTaskを並列で走らせたい
  • 225 lock構文で安全に並列処理をしたい
  • 226 フィールドをvolatile宣言して安全に並列処理をしたい
  • 227 Interlockedクラスを使用して安全に並列処理をしたい
  • 228 並列処理で安全にコレクションにアクセスしたい
  • 229 Progress<T>で進行状況を表示したい

Chapter 15 リフレクション

  • 230 オブジェクトの型情報を取得したい
  • 231 リフレクションを利用しプロパティの値を取得したい
  • 232 リフレクションを利用しプロパティに値を設定したい
  • 233 指定した型のプロパティの一覧を取得したい
  • 234 リフレクションを利用しメソッドを呼び出したい
  • 235 指定した型のメソッドの一覧を取得したい
  • 236 コンストラクターを動的に呼び出したい
  • 237 コンストラクターの一覧を得たい
  • 238 現在のクラス名,メソッド名を取得したい
  • 239 実行時にオブジェクトの型の種類を調べたい
  • 240 プロパティに指定した属性が付加されているか調べたい
  • 241 プロパティに付加された属性の値を取得したい
  • 242 メソッドに付加された属性を取得したい
  • 243 列挙型のフィールドに付加された属性を取得したい
  • 244 クラスに付加された属性を取得したい
  • 245 オブジェクトのプロパティ名と値をDictionary<TKey,TValue>に変換したい
  • 246 文字列プロパティの値がnullならすべて空文字列にしたい
  • 247 独自の属性を定義したい

Chapter 16 正規表現

  • 248 文字列が指定したパターンと一致するか調べたい
  • 249 文字列の中からパターンに一致する箇所をひとつ取り出したい
  • 250 文字列の中からパターンに一致する箇所をすべて取り出したい
  • 251 正規表現を使い高度な置換処理をしたい
  • 252 文字列を指定したパターンで分割したい
  • 253 大文字小文字を区別せずマッチさせたい
  • 254 複数行モードで正規表現を使いたい

Chapter 17 ファイルとディレクトリ

  • 255 ファイルパスを組み立てたい
  • 256 パス名を構成要素に分割したい
  • 257 相対ファイルパスを絶対パスに変換したい
  • 258 ファイルを操作したい
  • 259 ファイルの拡張子を変更したい
  • 260 ファイルサイズを取得したい
  • 261 ファイルの更新日時を取得/更新したい
  • 262 ファイルの読み取り専用属性を取得または設定したい
  • 263 ディレクトリを操作したい
  • 264 指定したディレクトリにあるファイル一覧を得たい
  • 265 指定したディレクトリにあるディレクトリ一覧を得たい
  • 266 現在の作業ディレクトリを取得したい
  • 267 一時的に利用するファイルを作成したい
  • 268 特殊なフォルダ名を取得したい
  • 269 テキストファイルを読み込みたい
  • 270 テキストファイルを作成したい
  • 271 テキストファイルに追記したい
  • 272 Shift-JISのファイルを扱いたい
  • 273 バイナリファイルを読み込みたい
  • 274 byte配列のデータをファイルに出力したい
  • 275 文字列をStreamとして扱いたい

Chapter 18 Zipファイル

  • 276 ディレクトリからZipアーカイブを作成したい
  • 277 Zipアーカイブに新しいファイルを追記したい
  • 278 Zipアーカイブからファイルを削除したい
  • 279 Zipアーカイブファイルに格納されているファイルの一覧を取得したい
  • 280 Zipアーカイブ内のファイルをすべて抽出したい
  • 281 Zipアーカイブから指定したファイルを抽出したい

Chapter 19 ロギング

  • 282 ILoggerでログを出力したい
  • 283 appsettings.jsonでログレベルを設定したい
  • 284 コードでログレベルを設定したい
  • 285 ログ出力でメッセージテンプレートを使用したい
  • 286 NLogを使いたい
  • 287 Log4Netを使いたい
  • 288 ZLoggerを使いたい

Chapter 20 Entity Framework Core

  • 289 Entity Framework Coreの利用を開始したい
  • 290 Entity Framework Coreでモデルを定義したい
  • 291 データベーステーブル間のリレーションを定義したい
  • 292 属性を使いエンティティクラスのプロパティに制約を設定したい
  • 293 エンティティクラスにデータベーステーブルにマッピングされないプロパティを定義したい
  • 294 データベースのテーブル名,カラム名を明示的に指定したい
  • 295 エンティティクラスのプロパティで主キーを明示したい
  • 296 データベーステーブルのカラムにインデックスを作成したい
  • 297 列挙型の値を文字列としてデータベースに格納したい
  • 298 データベーステーブルに行を挿入したい
  • 299 データベーステーブルから条件に合致した行を取得したい
  • 300 データベースから関連するテーブルのデータを取得したい
  • 301 データベーステーブルの行を更新したい
  • 302 データベーステーブルから行を削除したい
  • 303 データベースからデータを読み込まずに更新したい
  • 304 EF Coreで生のSQLを発行したい
  • 305 EF Coreでトランザクションを制御したい
  • 306 EF Coreで更新されないシナリオでパフォーマンスを向上させたい
  • 307 EF Coreでオプティミスティック同時実行制御を行いたい
  • 308 EF Coreでコマンドタイムアウト値を設定したい
  • 309 EF Coreが出力するSQLを確認したい

Chapter 21 ネットワーク

  • 310 HTMLをエンコード・デコードしたい
  • 311 URLをエンコード・デコードしたい
  • 312 JSONシリアライズ,デシリアライズしたい
  • 313 パラメーター付きクエリ文字列を組み立てたい
  • 314 URLで指定したWebページ(HTML)を取得したい
  • 315 Webサーバーからファイルをダウンロードしたい
  • 316 指定したURLからJSONデータを取得したい
  • 317 HttpClientでContent-typeを指定したい
  • 318 HttpClientでリクエストヘッダーにUser-Agentを設定したい
  • 319 HttpClientでHTTPステータスコードを確認したい
  • 320 HTTPメソッドを指定してAPIを呼び出したい
  • 321 HTTP POSTでフォームデータを送信したい
  • 322 HTTP POSTでJSONデータを送信したい
  • 323 HttpClientFactoryで生成したHttpClientを利用したい
  • 324 Http通信のログを出力したい
  • 325 メールを送信したい
  • 326 添付ファイル付きメールを送信したい

Chapter 22 暗号化

  • 327 共有キー暗号方式の暗号化と復号のためのキーを生成したい
  • 328 共有キー暗号方式で文字列を暗号化したい
  • 329 共有キー暗号方式で暗号化された文字列を復号したい
  • 330 共有キー暗号方式でファイルを暗号化したい
  • 331 共有キー暗号方式で暗号化されたファイルを復号したい
  • 332 公開キー暗号方式で利用する公開キーと秘密キーを生成したい
  • 333 公開キー暗号方式の秘密キーをキーコンテナに格納したい
  • 334 公開キー暗号方式を使って暗号化したい
  • 335 公開キー暗号方式を使って復号したい
  • 336 RSA公開キーファイル(PKCS#1)を使って暗号化したい
  • 337 RSA秘密キーファイル(PKCS#1)を使って復号したい
  • 338 データのハッシュ値を求めたい
  • 339 ハッシュ値を使いデータの検証を行いたい
  • 340 デジタル署名をしたい
  • 341 デジタル署名したデータを検証したい

Chapter 23 ExcelとWord

  • 342 [Excel]NPOIを使ってExcelファイルを作成したい
  • 343 [Excel]NPOIを使ってセルに値を設定したい
  • 344 [Excel]NPOIを使って特定のセルの値を取得したい
  • 345 [Excel]NPOIを使ってすべてのセルの値を取得したい
  • 346 [Excel]NPOIを使ってセルの値を変更したい
  • 347 [Excel]NPOIを使ってセルにスタイルを設定したい
  • 348 [Word]OpenXMLでWord文書を新規作成したい
  • 349 [Word]OpenXMLで段落の位置揃えをしたい
  • 350 [Word]OpenXMLで既存文書に段落を挿入したい
  • 351 [Word]OpenXMLで段落にスタイルを適用したい

Chapter 24 単体テスト

  • 352 xUnit.netを使いたい
  • 353 メソッドが期待した値を返してくるかテストしたい
  • 354 指定した範囲に収まっているかテストしたい
  • 355 指定した例外が発生するかテストしたい
  • 356 テストの前処理を記述したい
  • 357 InlineData属性でテストメソッドに渡すパラメーターの値を指定したい
  • 358 Member属性でテストメソッドに渡すパラメーターの値を指定したい
  • 359 単体テストでデバッグメッセージを出力したい
  • 360 [Moq]Moqの利用を開始したい
  • 361 [Moq]Mockオブジェクトにプロパティを定義したい
  • 362 [Moq]Mockオブジェクトにメソッドを定義したい
  • 363 [Moq]Mockオブジェクトに例外を発生させるメソッドを設定したい
  • 364 [Moq]Mockオブジェクトでメソッドが呼び出された際の処理を記述したい
  • 365 [xUnit][Moq]Mockを使って単体テストを行いたい
  • 366 [xUnit][Moq]MockをDIして単体テストを行いたい

Chapter 25 落穂拾い

  • 367 byte配列とBase64文字列を相互変換したい
  • 368 文字列をBase64でエンコード・デコードしたい
  • 369 byte配列を16進表記したい
  • 370 どのメソッドから呼び出されたのか知りたい
  • 371 OSの情報を取得したい
  • 372 論理プロセッサの数を調べたい
  • 373 環境変数を取得したい
  • 374 現在のプロセス環境ブロックで環境変数をセットしたい
  • 375 GUIDを生成したい
  • 376 指定した間隔である処理を繰り返し動かしたい
  • 377 ある時点からの経過時間を求めたい
  • 378 プロセスを起動したい
  • 379 起動したプロセスが終了するまで待ちたい
  • 380 起動したプロセスの標準出力の内容を取得したい
  • 381 標準エラー出力にメッセージを出力したい
  • 382 VisualStudioのデバッグウィンドウにログを出力したい
  • 383 コンソールアプリケーションで汎用ホストを利用したい
  • 384 appsettings.jsonから構成データの値を取得したい
  • 385 構成データを環境により切り替えたい
  • 参考文献
  • Index

著者プロフィール

出井秀行(いでいひでゆき)

東京理科大学理工学部情報科学科卒業。株式会社ジードに勤務。
2004年からgushwellというハンドルネームでオンライン活動を開始。主にC#に関する技術情報を発信。2005年から17年連続でMicrosoft MVPアワードを受賞。
著書『実戦で役立つ C#プログラミングのイディオム/定石&パターン』『新・標準プログラマーズライブラリ なるほどなっとくC#入門』など。