C#逆引き大全|やりたいことから探せる基本文法・実践サンプル集

はじめに

C#で開発していると、「文字列を分割したい」「Listから条件に合う要素を取り出したい」「JSONを読み書きしたい」など、やりたいことは明確なのに書き方がすぐに出てこない場面があります。

この記事では、C#の基本文法から実務でよく使う処理までを、目的別に逆引きできる形でまとめています。文法を一から順番に学ぶというよりも、「今やりたいこと」から該当するサンプルコードを探せる構成です。

初心者の学習用としても、実務中の確認用としても使えるように、できるだけ短く、すぐ試せるコードを中心に紹介します。

1. C#逆引き大全|やりたいことから探せるサンプル集

1-1. この記事で解決できること

この記事では、C#でよく使う処理を目的別に探せます。

たとえば、次のような悩みを解決できます。

「変数や定数の書き方を確認したい」
「if文やswitch文の使い方を思い出したい」
「文字列を分割・置換・検索したい」
「ListやDictionaryを実務で使いたい」
「LINQでデータを抽出・集計したい」
「ファイル、JSON、HTTP通信、非同期処理を扱いたい」

C#は文法がしっかりしている言語なので、基本を覚えるとWindowsアプリ、Webアプリ、API開発、Unity、業務システムなど幅広い分野で活用できます。

1-2. C#逆引きの使い方

このC#逆引き記事は、上から順番に読む必要はありません。

やりたいことが決まっている場合は、見出しから該当する項目を探してください。

たとえば、文字列を分割したい場合は「4-2. 文字列を分割したい」、JSONを読み書きしたい場合は「9-4. JSONを読み書きしたい」を確認します。

サンプルコードをそのままコピーして動かし、変数名や値を自分の処理に合わせて変更すると理解しやすくなります。

1-3. 初心者・実務者別の探し方

C#初心者の場合は、まず次の順番で読むのがおすすめです。

変数、型変換、条件分岐、繰り返し、配列、List、クラス、メソッドの流れで学ぶと、C#の基本文法が自然につながります。

実務でC#を使っている人は、LINQ、ファイル操作、JSON、例外処理、非同期処理、HTTP通信、null対策を中心に確認すると役立ちます。

特に実務では、単に動くコードを書くよりも、安全で読みやすく、あとから修正しやすいコードを書くことが重要です。

1-4. サンプルコードの前提環境

この記事のサンプルコードは、主にコンソールアプリで動かすことを想定しています。

基本的には次のような環境で試せます。

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

必要に応じて、サンプルの先頭にusingを追加してください。

また、非同期処理のサンプルではasync Task Main()を使います。

C#
class Program
{
static async Task Main()
{
await Task.Delay(1000);
Console.WriteLine("完了");
}
}

2. C#の基本文法を逆引きで探す

2-1. 変数を宣言したい

C#で変数を宣言するには、型名のあとに変数名を書きます。

C#
int age = 30;
string name = "Taro";
bool isActive = true;
double price = 1200.5;

型を明示せず、varを使うこともできます。

C#
var count = 10;
var message = "こんにちは";

varは型推論です。型がなくなるわけではなく、コンパイル時に型が決まります。

読みやすさを重視するなら、型が明確な場合はvar、意図を明示したい場合は型名を書くとよいでしょう。

2-2. 定数を使いたい

値を変更したくない場合はconstを使います。

C#
const double TaxRate = 0.1;
double price = 1000;
double total = price * (1 + TaxRate);

Console.WriteLine(total);

実行時に決まる値を変更不可にしたい場合はreadonlyを使います。

C#
class AppSettings
{
public readonly string AppName;

public AppSettings(string appName)
{
AppName = appName;
}
}

constはコンパイル時に決まる定数、readonlyは実行時に決まる読み取り専用の値として使い分けます。

2-3. 型を変換したい

文字列を数値に変換するにはint.Parseint.TryParseを使います。

C#
string text = "123";
int number = int.Parse(text);

Console.WriteLine(number);

安全に変換したい場合はTryParseを使います。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できません");
}

数値を文字列に変換するにはToString()を使います。

C#
int number = 123;
string text = number.ToString();

小数や日付も同じように文字列へ変換できます。

C#
double price = 1234.56;
Console.WriteLine(price.ToString("F2"));

2-4. nullableを扱いたい

C#では、値が存在しない可能性がある場合にnullableを使います。

C#
int? age = null;

if (age.HasValue)
{
Console.WriteLine(age.Value);
}
else
{
Console.WriteLine("年齢は未設定です");
}

??を使うと、nullの場合の代替値を指定できます。

C#
int? count = null;
int result = count ?? 0;

Console.WriteLine(result);

参照型でもnull対策は重要です。

C#
string? name = null;
Console.WriteLine(name ?? "名前なし");

nullの可能性がある値を扱うときは、必ずnullチェックを意識しましょう。

2-5. コメントを書きたい

1行コメントは//を使います。

C#
// 合計金額を計算する
int total = 100 + 200;

複数行コメントは/* */を使います。

C#
/*
ここは複数行コメントです。
処理の説明をまとめて書けます。
*/

XMLコメントを使うと、メソッドやクラスの説明を書けます。

C#
/// <summary>
/// 2つの数値を加算します。
/// </summary>
int Add(int a, int b)
{
return a + b;
}

コメントは「何をしているか」よりも、「なぜそうしているか」を書くと保守しやすくなります。

3. 条件分岐・繰り返し処理をしたい

3-1. if文で条件分岐したい

条件によって処理を分けるにはifを使います。

C#
int score = 85;

if (score >= 80)
{
Console.WriteLine("合格です");
}
else
{
Console.WriteLine("不合格です");
}

複数条件を判定する場合はelse ifを使います。

C#
int score = 70;

if (score >= 90)
{
Console.WriteLine("A");
}
else if (score >= 70)
{
Console.WriteLine("B");
}
else
{
Console.WriteLine("C");
}

条件を組み合わせる場合は&&||を使います。

C#
int age = 25;
bool hasTicket = true;

if (age >= 18 && hasTicket)
{
Console.WriteLine("入場できます");
}

3-2. switch文・switch式を使いたい

値によって処理を分ける場合はswitchが便利です。

C#
string rank = "A";

switch (rank)
{
case "A":
Console.WriteLine("優秀");
break;
case "B":
Console.WriteLine("良好");
break;
default:
Console.WriteLine("通常");
break;
}

値を返すだけならswitch式が読みやすいです。

C#
string rank = "A";

string message = rank switch
{
"A" => "優秀",
"B" => "良好",
_ => "通常"
};

Console.WriteLine(message);

_はどの条件にも当てはまらない場合を表します。

3-3. for文で指定回数ループしたい

指定回数だけ繰り返すにはfor文を使います。

C#
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}

配列のインデックスを使って処理する場合にも便利です。

C#
string[] names = { "Taro", "Jiro", "Saburo" };

for (int i = 0; i < names.Length; i++)
{
Console.WriteLine($"{i}: {names[i]}");
}

回数やインデックスが必要な場合はfor文を使うとわかりやすくなります。

3-4. foreachで配列やリストを回したい

配列やListの要素を順番に処理するにはforeachを使います。

C#
string[] fruits = { "Apple", "Banana", "Orange" };

foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}

Listでも同じように使えます。

C#
List<int> numbers = new List<int> { 10, 20, 30 };

foreach (int number in numbers)
{
Console.WriteLine(number);
}

インデックスが不要で、全要素を順番に処理したい場合はforeachが適しています。

3-5. while文で条件付きループしたい

条件を満たしている間だけ繰り返すにはwhileを使います。

C#
int count = 0;

while (count < 3)
{
Console.WriteLine(count);
count++;
}

最低1回は実行したい場合はdo whileを使います。

C#
int count = 0;

do
{
Console.WriteLine(count);
count++;
}
while (count < 3);

while文では、条件がずっとtrueにならないように注意しましょう。無限ループの原因になります。

3-6. break・continueで処理を制御したい

ループを途中で終了したい場合はbreakを使います。

C#
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
break;
}

Console.WriteLine(i);
}

特定の回だけ処理をスキップしたい場合はcontinueを使います。

C#
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
continue;
}

Console.WriteLine(i);
}

breakはループ終了、continueは次の繰り返しへ進む処理です。

4. 文字列を操作したい

4-1. 文字列を結合したい

文字列の結合には+を使えます。

C#
string firstName = "Taro";
string lastName = "Yamada";

string fullName = lastName + " " + firstName;
Console.WriteLine(fullName);

読みやすく書くなら文字列補間がおすすめです。

C#
string name = "Taro";
int age = 30;

string message = $"{name}さんは{age}歳です";
Console.WriteLine(message);

複数の文字列を区切り文字付きで結合する場合はstring.Joinを使います。

C#
string[] names = { "Taro", "Jiro", "Saburo" };
string result = string.Join(", ", names);

Console.WriteLine(result);

4-2. 文字列を分割したい

文字列を分割するにはSplitを使います。

C#
string csv = "apple,banana,orange";
string[] items = csv.Split(',');

foreach (string item in items)
{
Console.WriteLine(item);
}

空白で分割することもできます。

C#
string text = "C# LINQ JSON";
string[] words = text.Split(' ');

foreach (string word in words)
{
Console.WriteLine(word);
}

不要な空要素を除外したい場合は、StringSplitOptions.RemoveEmptyEntriesを使います。

C#
string text = "A,,B,C";
string[] items = text.Split(',', StringSplitOptions.RemoveEmptyEntries);

4-3. 文字列を検索・置換したい

文字列に特定の文字が含まれているか確認するにはContainsを使います。

C#
string text = "Hello C#";

if (text.Contains("C#"))
{
Console.WriteLine("C#が含まれています");
}

指定した文字列で始まるか確認するにはStartsWithを使います。

C#
string fileName = "sample.txt";

if (fileName.StartsWith("sample"))
{
Console.WriteLine("sampleで始まります");
}

文字列を置換するにはReplaceを使います。

C#
string text = "Hello Java";
string result = text.Replace("Java", "C#");

Console.WriteLine(result);

4-4. 文字列を大文字・小文字に変換したい

大文字に変換するにはToUpperを使います。

C#
string text = "hello";
Console.WriteLine(text.ToUpper());

小文字に変換するにはToLowerを使います。

C#
string text = "HELLO";
Console.WriteLine(text.ToLower());

比較用に大文字・小文字をそろえる場合は、カルチャの影響を避けるためにToUpperInvariantToLowerInvariantを使うこともあります。

C#
string input = "Admin";

if (input.ToLowerInvariant() == "admin")
{
Console.WriteLine("管理者です");
}

4-5. 空文字・nullを判定したい

文字列がnullまたは空文字か判定するにはstring.IsNullOrEmptyを使います。

C#
string? name = "";

if (string.IsNullOrEmpty(name))
{
Console.WriteLine("名前が未入力です");
}

空白だけの文字列も未入力として扱いたい場合はstring.IsNullOrWhiteSpaceを使います。

C#
string? name = "   ";

if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("名前が未入力です");
}

入力チェックでは、IsNullOrWhiteSpaceを使う場面が多いです。

4-6. 正規表現で文字列を抽出したい

正規表現を使うにはRegexを利用します。

C#
using System.Text.RegularExpressions;

string text = "注文番号は ABC-12345 です";
Match match = Regex.Match(text, @"[A-Z]{3}-\d{5}");

if (match.Success)
{
Console.WriteLine(match.Value);
}

複数の一致を取得する場合はMatchesを使います。

C#
string text = "商品ID: A001, B002, C003";
MatchCollection matches = Regex.Matches(text, @"[A-Z]\d{3}");

foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}

正規表現は便利ですが、複雑にしすぎると読みにくくなるため、用途を限定して使うのがおすすめです。

5. 数値・日付・時刻を扱いたい

5-1. 数値を四捨五入・切り捨てしたい

四捨五入にはMath.Roundを使います。

C#
double value = 123.456;
double result = Math.Round(value, 2);

Console.WriteLine(result);

切り捨てにはMath.Floorを使います。

C#
double value = 123.456;
double result = Math.Floor(value);

Console.WriteLine(result);

切り上げにはMath.Ceilingを使います。

C#
double value = 123.001;
double result = Math.Ceiling(value);

Console.WriteLine(result);

小数点以下を単純に削除したい場合は、型変換も使えます。

C#
double value = 123.456;
int result = (int)value;

Console.WriteLine(result);

5-2. ランダムな数値を生成したい

ランダムな整数を生成するにはRandomを使います。

C#
Random random = new Random();
int number = random.Next(1, 101);

Console.WriteLine(number);

この例では、1以上101未満、つまり1から100までの数値が生成されます。

小数を生成する場合はNextDoubleを使います。

C#
Random random = new Random();
double value = random.NextDouble();

Console.WriteLine(value);

NextDoubleは0.0以上1.0未満の値を返します。

5-3. 現在日時を取得したい

現在日時を取得するにはDateTime.Nowを使います。

C#
DateTime now = DateTime.Now;
Console.WriteLine(now);

日付だけを取得したい場合はDateTime.Todayを使います。

C#
DateTime today = DateTime.Today;
Console.WriteLine(today);

UTC時刻を扱う場合はDateTime.UtcNowを使います。

C#
DateTime utcNow = DateTime.UtcNow;
Console.WriteLine(utcNow);

システム間連携やAPIでは、タイムゾーンを意識してUTCを使うことが多いです。

5-4. 日付を加算・減算したい

日付に日数を加算するにはAddDaysを使います。

C#
DateTime today = DateTime.Today;
DateTime nextWeek = today.AddDays(7);

Console.WriteLine(nextWeek);

月を加算する場合はAddMonthsを使います。

C#
DateTime today = DateTime.Today;
DateTime nextMonth = today.AddMonths(1);

Console.WriteLine(nextMonth);

時間を加算する場合はAddHoursを使います。

C#
DateTime now = DateTime.Now;
DateTime afterThreeHours = now.AddHours(3);

Console.WriteLine(afterThreeHours);

減算したい場合は、負の値を指定します。

C#
DateTime yesterday = DateTime.Today.AddDays(-1);

5-5. 日付を文字列に変換したい

日付を指定形式の文字列に変換するにはToStringを使います。

C#
DateTime now = DateTime.Now;

Console.WriteLine(now.ToString("yyyy/MM/dd"));
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss"));

よく使う書式は次の通りです。

C#
DateTime now = DateTime.Now;

string date = now.ToString("yyyyMMdd");
string display = now.ToString("yyyy年MM月dd日");
string timestamp = now.ToString("yyyy-MM-dd HH:mm:ss");

ファイル名に日時を入れる場合にも便利です。

C#
string fileName = $"log_{DateTime.Now:yyyyMMdd_HHmmss}.txt";
Console.WriteLine(fileName);

5-6. 文字列を日付に変換したい

文字列を日付に変換するにはDateTime.Parseを使います。

C#
string text = "2026/01/01";
DateTime date = DateTime.Parse(text);

Console.WriteLine(date);

安全に変換したい場合はDateTime.TryParseを使います。

C#
string text = "2026/01/01";

if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付に変換できません");
}

形式が決まっている場合はParseExactを使います。

C#
using System.Globalization;

string text = "20260101";
DateTime date = DateTime.ParseExact(text, "yyyyMMdd", CultureInfo.InvariantCulture);

Console.WriteLine(date);

6. 配列・List・Dictionaryを使いたい

6-1. 配列を作成したい

配列は、同じ型の値をまとめて扱うために使います。

C#
int[] numbers = { 1, 2, 3, 4, 5 };

Console.WriteLine(numbers[0]);

要素数を指定して作成することもできます。

C#
string[] names = new string[3];

names[0] = "Taro";
names[1] = "Jiro";
names[2] = "Saburo";

配列の要素数はLengthで取得します。

C#
Console.WriteLine(names.Length);

配列はサイズが固定なので、要素の追加や削除が多い場合はListを使うのが一般的です。

6-2. Listに要素を追加・削除したい

Listを使うにはList<T>を使います。

C#
List<string> names = new List<string>();

names.Add("Taro");
names.Add("Jiro");
names.Add("Saburo");

foreach (string name in names)
{
Console.WriteLine(name);
}

要素を削除するにはRemoveを使います。

C#
names.Remove("Jiro");

インデックスを指定して削除する場合はRemoveAtを使います。

C#
names.RemoveAt(0);

すべて削除する場合はClearを使います。

C#
names.Clear();

Listは実務で非常によく使うコレクションです。

6-3. Dictionaryでキーと値を管理したい

キーと値の組み合わせを管理するにはDictionaryを使います。

C#
Dictionary<string, int> scores = new Dictionary<string, int>();

scores["Taro"] = 90;
scores["Jiro"] = 80;

Console.WriteLine(scores["Taro"]);

キーが存在するか確認するにはContainsKeyを使います。

C#
if (scores.ContainsKey("Taro"))
{
Console.WriteLine(scores["Taro"]);
}

安全に値を取得するにはTryGetValueが便利です。

C#
if (scores.TryGetValue("Saburo", out int score))
{
Console.WriteLine(score);
}
else
{
Console.WriteLine("データがありません");
}

Dictionaryは、IDとデータ、名前とスコア、設定キーと値などを扱う場面でよく使います。

6-4. コレクションを並び替えたい

Listを昇順に並び替えるにはSortを使います。

C#
List<int> numbers = new List<int> { 3, 1, 5, 2, 4 };

numbers.Sort();

foreach (int number in numbers)
{
Console.WriteLine(number);
}

降順にしたい場合はReverseを組み合わせます。

C#
numbers.Sort();
numbers.Reverse();

LINQを使う場合はOrderByOrderByDescendingを使います。

C#
List<int> numbers = new List<int> { 3, 1, 5, 2, 4 };

var sorted = numbers.OrderBy(n => n);

foreach (int number in sorted)
{
Console.WriteLine(number);
}

元のListを変更したくない場合はLINQが便利です。

6-5. コレクションから条件に合う要素を探したい

条件に合う要素を探すにはFindを使います。

C#
List<int> numbers = new List<int> { 10, 20, 30, 40 };

int result = numbers.Find(n => n >= 30);

Console.WriteLine(result);

複数の要素を取得したい場合はWhereを使います。

C#
var results = numbers.Where(n => n >= 30);

foreach (int number in results)
{
Console.WriteLine(number);
}

条件に合う要素が存在するかだけ確認したい場合はAnyを使います。

C#
bool exists = numbers.Any(n => n >= 30);

Console.WriteLine(exists);

6-6. 重複を削除したい

重複を削除するにはLINQのDistinctを使います。

C#
List<int> numbers = new List<int> { 1, 2, 2, 3, 3, 4 };

var uniqueNumbers = numbers.Distinct();

foreach (int number in uniqueNumbers)
{
Console.WriteLine(number);
}

文字列の重複も同じように削除できます。

C#
List<string> names = new List<string> { "Taro", "Jiro", "Taro" };

var uniqueNames = names.Distinct();

foreach (string name in uniqueNames)
{
Console.WriteLine(name);
}

結果をListに戻したい場合はToListを使います。

C#
List<int> uniqueList = numbers.Distinct().ToList();

7. クラス・メソッド・オブジェクト指向を使いたい

7-1. クラスを定義したい

クラスは、データと処理をまとめるための設計図です。

C#
class Person
{
public string Name { get; set; } = "";
public int Age { get; set; }
}

クラスには、プロパティやメソッドを定義できます。

C#
class Person
{
public string Name { get; set; } = "";

public void SayHello()
{
Console.WriteLine($"こんにちは、{Name}です");
}
}

C#では、クラスを使って関連するデータと処理をまとめることで、コードを整理しやすくなります。

7-2. インスタンスを作成したい

クラスからオブジェクトを作るにはnewを使います。

C#
Person person = new Person();

person.Name = "Taro";
person.Age = 30;

Console.WriteLine(person.Name);

オブジェクト初期化子を使うと簡潔に書けます。

C#
Person person = new Person
{
Name = "Taro",
Age = 30
};

クラスは設計図、インスタンスは実際に作られたデータと考えると理解しやすいです。

7-3. メソッドを定義したい

メソッドは処理をまとめるために使います。

C#
int Add(int a, int b)
{
return a + b;
}

int result = Add(3, 5);
Console.WriteLine(result);

戻り値がない場合はvoidを使います。

C#
void ShowMessage(string message)
{
Console.WriteLine(message);
}

ShowMessage("こんにちは");

メソッドに分けることで、同じ処理を再利用でき、コードの見通しもよくなります。

7-4. プロパティを使いたい

プロパティは、クラスの値を外部から読み書きするために使います。

C#
class Product
{
public string Name { get; set; } = "";
public int Price { get; set; }
}

読み取り専用にすることもできます。

C#
class Product
{
public string Name { get; }

public Product(string name)
{
Name = name;
}
}

値を設定するときにチェックを入れることもできます。

C#
class Product
{
private int price;

public int Price
{
get { return price; }
set
{
if (value < 0)
{
throw new ArgumentException("価格は0以上にしてください");
}

price = value;
}
}
}

7-5. コンストラクタを使いたい

コンストラクタは、インスタンス作成時に実行される特別なメソッドです。

C#
class Person
{
public string Name { get; }
public int Age { get; }

public Person(string name, int age)
{
Name = name;
Age = age;
}
}

使い方は次の通りです。

C#
Person person = new Person("Taro", 30);

Console.WriteLine(person.Name);
Console.WriteLine(person.Age);

必ず必要な値は、コンストラクタで受け取るようにすると安全です。

7-6. 継承・interfaceを使いたい

継承を使うと、既存クラスの機能を引き継げます。

C#
class Animal
{
public void Eat()
{
Console.WriteLine("食べます");
}
}

class Dog : Animal
{
public void Bark()
{
Console.WriteLine("ワン");
}
}

interfaceは、クラスが持つべき機能の約束を定義します。

C#
interface ILogger
{
void Log(string message);
}

class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine(message);
}
}

実務では、継承よりもinterfaceを使って依存関係を整理する場面が多いです。

7-7. record・structを使い分けたい

recordは、主に値のまとまりを表すデータモデルに向いています。

C#
public record User(string Name, int Age);

使い方は次の通りです。

C#
User user1 = new User("Taro", 30);
User user2 = new User("Taro", 30);

Console.WriteLine(user1 == user2);

recordは値の比較がしやすいため、DTOや設定値のようなデータ表現に便利です。

structは値型を定義する場合に使います。

C#
public struct Point
{
public int X { get; }
public int Y { get; }

public Point(int x, int y)
{
X = x;
Y = y;
}
}

基本的にはクラスを使い、データの不変性や値比較を重視する場合はrecord、軽量な値型が必要な場合はstructを検討するとよいでしょう。

8. LINQでデータを抽出・集計したい

8-1. Whereで条件抽出したい

LINQのWhereを使うと、条件に合う要素を抽出できます。

C#
List<int> numbers = new List<int> { 10, 20, 30, 40, 50 };

var results = numbers.Where(n => n >= 30);

foreach (int number in results)
{
Console.WriteLine(number);
}

オブジェクトのListから条件抽出することもできます。

C#
List<Person> people = new List<Person>
{
new Person { Name = "Taro", Age = 30 },
new Person { Name = "Jiro", Age = 20 }
};

var adults = people.Where(p => p.Age >= 20);

Whereは実務でも非常によく使うLINQの基本です。

8-2. Selectで変換したい

Selectを使うと、要素を別の形に変換できます。

C#
List<string> names = new List<string> { "Taro", "Jiro", "Saburo" };

var messages = names.Select(name => $"{name}さん");

foreach (string message in messages)
{
Console.WriteLine(message);
}

オブジェクトから特定のプロパティだけを取り出すこともできます。

C#
var namesOnly = people.Select(p => p.Name);

匿名型に変換することもできます。

C#
var summaries = people.Select(p => new
{
p.Name,
IsAdult = p.Age >= 20
});

8-3. OrderByで並び替えたい

昇順で並び替えるにはOrderByを使います。

C#
List<int> numbers = new List<int> { 3, 1, 5, 2, 4 };

var sorted = numbers.OrderBy(n => n);

降順で並び替えるにはOrderByDescendingを使います。

C#
var sortedDesc = numbers.OrderByDescending(n => n);

オブジェクトのプロパティで並び替えることもできます。

C#
var sortedPeople = people.OrderBy(p => p.Age);

複数条件で並び替える場合はThenByを使います。

C#
var result = people
.OrderBy(p => p.Age)
.ThenBy(p => p.Name);

8-4. GroupByでグループ化したい

GroupByを使うと、指定したキーでグループ化できます。

C#
var people = new List<Person>
{
new Person { Name = "Taro", Age = 30 },
new Person { Name = "Jiro", Age = 20 },
new Person { Name = "Saburo", Age = 30 }
};

var groups = people.GroupBy(p => p.Age);

foreach (var group in groups)
{
Console.WriteLine($"年齢: {group.Key}");

foreach (var person in group)
{
Console.WriteLine(person.Name);
}
}

集計と組み合わせることもできます。

C#
var counts = people
.GroupBy(p => p.Age)
.Select(g => new
{
Age = g.Key,
Count = g.Count()
});

8-5. Count・Sum・Averageで集計したい

要素数を数えるにはCountを使います。

C#
List<int> numbers = new List<int> { 10, 20, 30 };

int count = numbers.Count();
Console.WriteLine(count);

合計を求めるにはSumを使います。

C#
int sum = numbers.Sum();
Console.WriteLine(sum);

平均を求めるにはAverageを使います。

C#
double average = numbers.Average();
Console.WriteLine(average);

条件に合う件数を数えることもできます。

C#
int countOver20 = numbers.Count(n => n >= 20);

8-6. FirstOrDefault・Anyで存在確認したい

最初の要素を取得するにはFirstOrDefaultを使います。

C#
List<int> numbers = new List<int> { 10, 20, 30 };

int result = numbers.FirstOrDefault(n => n >= 20);

Console.WriteLine(result);

参照型の場合、見つからないとnullが返ることがあります。

C#
Person? person = people.FirstOrDefault(p => p.Name == "Taro");

if (person != null)
{
Console.WriteLine(person.Name);
}

存在確認だけならAnyを使います。

C#
bool exists = people.Any(p => p.Age >= 20);

Console.WriteLine(exists);

FirstOrDefaultで取得し、Anyで存在だけ確認する、と使い分けるとよいです。

9. ファイル・フォルダを操作したい

9-1. テキストファイルを読み込みたい

テキストファイルを読み込むにはFile.ReadAllTextを使います。

C#
string text = File.ReadAllText("sample.txt");

Console.WriteLine(text);

行単位で読み込む場合はFile.ReadAllLinesを使います。

C#
string[] lines = File.ReadAllLines("sample.txt");

foreach (string line in lines)
{
Console.WriteLine(line);
}

大きなファイルを1行ずつ処理する場合はFile.ReadLinesが便利です。

C#
foreach (string line in File.ReadLines("sample.txt"))
{
Console.WriteLine(line);
}

9-2. テキストファイルに書き込みたい

テキストファイルに書き込むにはFile.WriteAllTextを使います。

C#
File.WriteAllText("output.txt", "こんにちは");

複数行を書き込む場合はFile.WriteAllLinesを使います。

C#
string[] lines = { "1行目", "2行目", "3行目" };

File.WriteAllLines("output.txt", lines);

追記したい場合はFile.AppendAllTextを使います。

C#
File.AppendAllText("output.txt", "追記するテキスト\n");

既存ファイルを上書きしたくない場合は、事前に存在確認を行いましょう。

9-3. CSVを読み書きしたい

簡単なCSVを読み込むには、行ごとに読み込んでSplitします。

C#
foreach (string line in File.ReadLines("data.csv"))
{
string[] columns = line.Split(',');

Console.WriteLine(columns[0]);
}

CSVを書き込む場合は、カンマ区切りの文字列を作成します。

C#
List<string> lines = new List<string>
{
"Id,Name,Age",
"1,Taro,30",
"2,Jiro,25"
};

File.WriteAllLines("data.csv", lines);

ただし、値にカンマや改行、ダブルクォートが含まれるCSVは単純なSplitでは正しく処理できません。実務ではCSVライブラリの利用も検討しましょう。

9-4. JSONを読み書きしたい

JSONを扱うにはSystem.Text.Jsonを使います。

C#
using System.Text.Json;

var user = new User
{
Name = "Taro",
Age = 30
};

string json = JsonSerializer.Serialize(user);

Console.WriteLine(json);

JSONからオブジェクトに戻すにはDeserializeを使います。

C#
string json = "{\"Name\":\"Taro\",\"Age\":30}";

User? user = JsonSerializer.Deserialize<User>(json);

if (user != null)
{
Console.WriteLine(user.Name);
}

クラスは次のように定義します。

C#
class User
{
public string Name { get; set; } = "";
public int Age { get; set; }
}

整形して出力したい場合はオプションを指定します。

C#
var options = new JsonSerializerOptions
{
WriteIndented = true
};

string json = JsonSerializer.Serialize(user, options);

9-5. ファイルの存在を確認したい

ファイルが存在するか確認するにはFile.Existsを使います。

C#
string path = "sample.txt";

if (File.Exists(path))
{
Console.WriteLine("ファイルがあります");
}
else
{
Console.WriteLine("ファイルがありません");
}

存在する場合だけ読み込むようにすると、エラーを防ぎやすくなります。

C#
if (File.Exists(path))
{
string text = File.ReadAllText(path);
Console.WriteLine(text);
}

フォルダの存在確認にはDirectory.Existsを使います。

C#
if (Directory.Exists("logs"))
{
Console.WriteLine("フォルダがあります");
}

9-6. フォルダを作成・削除したい

フォルダを作成するにはDirectory.CreateDirectoryを使います。

C#
Directory.CreateDirectory("logs");

すでに存在していてもエラーになりにくいため、事前チェックなしでも使いやすいです。

フォルダを削除するにはDirectory.Deleteを使います。

C#
Directory.Delete("logs");

中にファイルがあるフォルダを削除する場合は、第2引数にtrueを指定します。

C#
Directory.Delete("logs", true);

削除処理は元に戻せないため、対象パスを間違えないように注意しましょう。

10. 例外処理・デバッグをしたい

10-1. try-catchで例外処理したい

例外が発生する可能性のある処理はtry-catchで囲みます。

C#
try
{
string text = File.ReadAllText("sample.txt");
Console.WriteLine(text);
}
catch (FileNotFoundException)
{
Console.WriteLine("ファイルが見つかりません");
}
catch (Exception ex)
{
Console.WriteLine($"エラーが発生しました: {ex.Message}");
}

具体的な例外を先に書き、最後にExceptionでその他の例外を受けるのが基本です。

例外を握りつぶすと原因がわからなくなるため、最低限ログやメッセージを残しましょう。

10-2. finallyで後処理したい

例外の有無に関係なく実行したい処理はfinallyに書きます。

C#
try
{
Console.WriteLine("処理開始");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("後処理");
}

ファイルやネットワーク接続など、リソース解放が必要な処理に使われます。

ただし、C#ではusingを使うことで自動的にリソース解放できる場面も多いです。

C#
using StreamReader reader = new StreamReader("sample.txt");
string text = reader.ReadToEnd();

10-3. 独自例外を作りたい

独自の例外クラスを作るにはExceptionを継承します。

C#
class InvalidOrderException : Exception
{
public InvalidOrderException(string message) : base(message)
{
}
}

使う側ではthrowで例外を発生させます。

C#
void ValidateOrder(int quantity)
{
if (quantity <= 0)
{
throw new InvalidOrderException("注文数は1以上にしてください");
}
}

独自例外は、業務ルールに関するエラーを明確に表現したい場合に便利です。

10-4. ログを出力したい

簡単なログはConsole.WriteLineで出力できます。

C#
Console.WriteLine("処理を開始しました");

ファイルにログを出力する場合はFile.AppendAllTextを使えます。

C#
string message = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 処理を開始しました";
File.AppendAllText("app.log", message + Environment.NewLine);

例外情報もログに残すと調査しやすくなります。

C#
try
{
int result = int.Parse("abc");
}
catch (Exception ex)
{
File.AppendAllText("error.log", ex.ToString() + Environment.NewLine);
}

実務では、ログレベルや出力先を管理できるログライブラリを使うことも多いです。

10-5. よくあるエラーの原因を調べたい

C#でよくあるエラーには、null参照、型変換失敗、範囲外アクセス、ファイル未存在などがあります。

null参照の例です。

C#
string? name = null;
Console.WriteLine(name.Length);

この場合、nameがnullなのでエラーになります。

C#
if (name != null)
{
Console.WriteLine(name.Length);
}

配列の範囲外アクセスにも注意が必要です。

C#
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers[3]);

配列のインデックスは0から始まるため、最後の要素はnumbers[2]です。

エラーが出たら、メッセージ、発生行、変数の中身を確認しましょう。

10-6. Visual Studioでデバッグしたい

Visual Studioでは、ブレークポイントを設定して処理を一時停止できます。

確認したい行の左側をクリックすると、赤い丸が表示されます。その状態で実行すると、その行で処理が止まります。

デバッグ中は、変数の値を確認したり、1行ずつ実行したりできます。

よく使う操作は次の通りです。

C#
int a = 10;
int b = 20;
int total = a + b;

Console.WriteLine(total);

このようなコードでtotalの行にブレークポイントを置くと、計算前後の値を確認できます。

デバッグは、コードを読むだけではわからない動きを確認するための重要な手段です。

11. 非同期処理・タスク処理をしたい

11-1. async・awaitを使いたい

非同期処理を書くにはasyncawaitを使います。

C#
static async Task Main()
{
await DoWorkAsync();
}

static async Task DoWorkAsync()
{
await Task.Delay(1000);
Console.WriteLine("非同期処理が完了しました");
}

awaitを使うと、時間のかかる処理を待ちながら、スレッドを無駄にブロックしにくくなります。

戻り値がある場合はTask<T>を使います。

C#
static async Task<int> GetNumberAsync()
{
await Task.Delay(1000);
return 100;
}

11-2. Taskを実行したい

別の処理をTaskとして実行するにはTask.Runを使います。

C#
Task task = Task.Run(() =>
{
Console.WriteLine("Taskを実行中");
});

await task;

戻り値を受け取ることもできます。

C#
int result = await Task.Run(() =>
{
return 10 + 20;
});

Console.WriteLine(result);

CPU負荷の高い処理を別スレッドで実行したい場合などに使われます。

11-3. 複数の非同期処理を待ちたい

複数の非同期処理をまとめて待つにはTask.WhenAllを使います。

C#
Task task1 = Task.Delay(1000);
Task task2 = Task.Delay(2000);
Task task3 = Task.Delay(3000);

await Task.WhenAll(task1, task2, task3);

Console.WriteLine("すべて完了しました");

戻り値がある場合も使えます。

C#
Task<int> task1 = GetNumberAsync();
Task<int> task2 = GetNumberAsync();

int[] results = await Task.WhenAll(task1, task2);

Console.WriteLine(results.Sum());

複数のAPI呼び出しやファイル処理を並行して実行したい場合に便利です。

11-4. キャンセル処理を実装したい

非同期処理をキャンセル可能にするにはCancellationTokenを使います。

C#
static async Task DoWorkAsync(CancellationToken token)
{
for (int i = 0; i < 10; i++)
{
token.ThrowIfCancellationRequested();

Console.WriteLine(i);
await Task.Delay(1000, token);
}
}

呼び出し側ではCancellationTokenSourceを使います。

C#
using CancellationTokenSource cts = new CancellationTokenSource();

Task task = DoWorkAsync(cts.Token);

cts.Cancel();

try
{
await task;
}
catch (OperationCanceledException)
{
Console.WriteLine("キャンセルされました");
}

長時間処理やユーザー操作で中断したい処理に使います。

11-5. 非同期処理の例外を扱いたい

非同期処理でもtry-catchを使って例外を扱えます。

C#
try
{
await DoWorkAsync();
}
catch (Exception ex)
{
Console.WriteLine($"エラー: {ex.Message}");
}

Task.WhenAllで複数処理を待つ場合も例外に注意が必要です。

C#
try
{
await Task.WhenAll(task1, task2);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

非同期メソッド内で発生した例外は、awaitしたタイミングで呼び出し元に伝わります。

例外を放置すると原因調査が難しくなるため、必要に応じてログ出力を行いましょう。

12. 実務でよく使うC#サンプルを探す

12-1. HTTPリクエストを送信したい

HTTPリクエストを送信するにはHttpClientを使います。

C#
using System.Net.Http;

HttpClient client = new HttpClient();

string result = await client.GetStringAsync("https://example.com");

Console.WriteLine(result);

usingを使って書くこともできます。

C#
using HttpClient client = new HttpClient();

HttpResponseMessage response = await client.GetAsync("https://example.com");
string body = await response.Content.ReadAsStringAsync();

Console.WriteLine(body);

実務では、HttpClientの使い回しやタイムアウト設定も重要になります。

C#
client.Timeout = TimeSpan.FromSeconds(10);

12-2. APIのJSONレスポンスを取得したい

APIからJSONを取得し、オブジェクトに変換する例です。

C#
using System.Net.Http;
using System.Text.Json;

using HttpClient client = new HttpClient();

string json = await client.GetStringAsync("https://example.com/api/user");

User? user = JsonSerializer.Deserialize<User>(json);

if (user != null)
{
Console.WriteLine(user.Name);
}

プロパティ名の大文字・小文字を区別したくない場合はオプションを指定します。

C#
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};

User? user = JsonSerializer.Deserialize<User>(json, options);

API連携では、通信エラー、タイムアウト、JSON形式の違いに注意しましょう。

12-3. データベースに接続したい

C#でデータベースに接続する方法はいくつかあります。SQL Serverを使う場合は、ADO.NETやEntity Framework Coreなどが選択肢になります。

ADO.NETの基本イメージは次の通りです。

C#
using Microsoft.Data.SqlClient;

string connectionString = "Server=localhost;Database=SampleDb;Trusted_Connection=True;TrustServerCertificate=True;";

using SqlConnection connection = new SqlConnection(connectionString);
await connection.OpenAsync();

string sql = "SELECT Name FROM Users";

using SqlCommand command = new SqlCommand(sql, connection);
using SqlDataReader reader = await command.ExecuteReaderAsync();

while (await reader.ReadAsync())
{
Console.WriteLine(reader["Name"]);
}

実務では、接続文字列をコードに直接書かず、設定ファイルや環境変数から読み込むようにします。

また、SQLを文字列結合で作るとSQLインジェクションの危険があるため、パラメータを使うことが重要です。

12-4. Windowsアプリで画面を作りたい

C#でWindowsアプリを作る場合、Windows FormsやWPFがよく使われます。

Windows Formsでは、ボタンをクリックしたときの処理をイベントとして書きます。

C#
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "ボタンがクリックされました";
}

テキストボックスの値を取得する例です。

C#
private void button1_Click(object sender, EventArgs e)
{
string name = textBox1.Text;
MessageBox.Show($"こんにちは、{name}さん");
}

画面アプリでは、イベント、コントロール、入力チェック、例外処理を組み合わせて作ります。

12-5. UnityでC#スクリプトを書きたい

Unityでは、C#スクリプトを使ってゲームオブジェクトの動きを制御します。

C#
using UnityEngine;

public class PlayerController : MonoBehaviour
{
void Start()
{
Debug.Log("ゲーム開始");
}

void Update()
{
transform.Translate(Vector3.forward * Time.deltaTime);
}
}

Startは最初に呼ばれ、Updateは毎フレーム呼ばれます。

キー入力で移動する例です。

C#
void Update()
{
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");

Vector3 movement = new Vector3(x, 0, z);
transform.Translate(movement * Time.deltaTime * 5f);
}

UnityのC#では、通常のC#文法に加えて、Unity独自のライフサイクルやコンポーネントの考え方を理解する必要があります。

12-6. 設定ファイルを読み込みたい

簡単な設定ファイルをJSONで用意し、C#で読み込む例です。

appsettings.jsonの例です。

JSON
{
"AppName": "SampleApp",
"MaxCount": 10
}

C#側のクラスです。

C#
class AppSettings
{
public string AppName { get; set; } = "";
public int MaxCount { get; set; }
}

読み込み処理です。

C#
string json = File.ReadAllText("appsettings.json");

AppSettings? settings = JsonSerializer.Deserialize<AppSettings>(json);

if (settings != null)
{
Console.WriteLine(settings.AppName);
Console.WriteLine(settings.MaxCount);
}

設定値をコードに直接書かず、外部ファイルに分けることで、環境ごとの変更に対応しやすくなります。

13. C#コードを安全で読みやすく書きたい

13-1. 命名規則を整えたい

C#では、クラス名やメソッド名にはPascalCaseを使うのが一般的です。

C#
class UserService
{
public void CreateUser()
{
}
}

ローカル変数や引数にはcamelCaseを使います。

C#
void ShowMessage(string userName)
{
string messageText = $"こんにちは、{userName}さん";
Console.WriteLine(messageText);
}

名前は短すぎず、役割がわかるものにしましょう。

C#
int userCount = 10;
string errorMessage = "入力値が不正です";

atmpのような名前は、意味が伝わりにくいため避けた方がよいです。

13-2. null参照を防ぎたい

null参照を防ぐには、nullチェックを適切に行います。

C#
string? name = GetName();

if (name != null)
{
Console.WriteLine(name.Length);
}

nullの場合の代替値には??を使います。

C#
string displayName = name ?? "ゲスト";

null条件演算子?.を使うと、nullの場合に処理をスキップできます。

C#
int? length = name?.Length;

メソッドの戻り値がnullになる可能性がある場合は、型に?を付けて意図を明確にすると安全です。

C#
string? FindUserName(int id)
{
return null;
}

13-3. usingでリソースを解放したい

ファイルやデータベース接続などは、使い終わったら解放する必要があります。

usingを使うと、自動的にリソースを解放できます。

C#
using StreamReader reader = new StreamReader("sample.txt");

string text = reader.ReadToEnd();
Console.WriteLine(text);

従来の書き方もあります。

C#
using (StreamReader reader = new StreamReader("sample.txt"))
{
string text = reader.ReadToEnd();
Console.WriteLine(text);
}

IDisposableを実装しているオブジェクトは、基本的にusingで扱うことを意識しましょう。

13-4. 可読性の高いメソッドに分割したい

1つのメソッドに多くの処理を書きすぎると、読みにくくなります。

悪い例です。

C#
void Process()
{
string name = "Taro";
int age = 30;

if (age >= 20)
{
Console.WriteLine($"{name}は成人です");
}
}

処理の意味ごとに分割すると読みやすくなります。

C#
void Process()
{
Person person = CreatePerson();
ShowAdultMessage(person);
}

Person CreatePerson()
{
return new Person { Name = "Taro", Age = 30 };
}

void ShowAdultMessage(Person person)
{
if (person.Age >= 20)
{
Console.WriteLine($"{person.Name}は成人です");
}
}

メソッド名だけで処理内容が伝わるようにすると、コメントが少なくても読みやすいコードになります。

13-5. パフォーマンスを意識して書きたい

C#では、多くの場合、まず読みやすいコードを書くことが大切です。そのうえで、処理が遅い箇所を測定して改善します。

文字列を大量に結合する場合は、StringBuilderを使うと効率的です。

C#
using System.Text;

StringBuilder builder = new StringBuilder();

for (int i = 0; i < 1000; i++)
{
builder.AppendLine($"行 {i}");
}

string result = builder.ToString();

Listの検索が大量に発生する場合は、DictionaryやHashSetを使うと改善できることがあります。

C#
HashSet<int> ids = new HashSet<int> { 1, 2, 3 };

if (ids.Contains(2))
{
Console.WriteLine("存在します");
}

パフォーマンス改善では、推測だけで書き換えず、実際に遅い処理を確認してから対応することが重要です。

14. C#逆引きでよくある質問

14-1. C#初心者は何から覚えるべき?

C#初心者は、まず基本文法から覚えるのがおすすめです。

最初に学ぶべき内容は、変数、型、if文、for文、配列、List、メソッド、クラスです。

特に、メソッドとクラスを理解できるようになると、C#らしいコードが書けるようになります。

次に、LINQ、例外処理、ファイル操作、JSON、非同期処理を学ぶと、実務に近いプログラムを作れるようになります。

最初からすべてを暗記する必要はありません。小さなサンプルを動かしながら、必要な文法を逆引きして覚えていくのが効率的です。

14-2. C#と.NETの違いは?

C#はプログラミング言語です。一方、.NETはC#などで作ったプログラムを動かすための開発基盤です。

C#でコードを書き、.NETのライブラリや実行環境を使ってアプリケーションを作る、と考えるとわかりやすいです。

たとえば、文字列、ファイル操作、HTTP通信、JSON処理、データベース接続などは、.NETが提供する機能をC#から利用します。

つまり、C#は「書くための言語」、.NETは「動かすための基盤と便利な機能の集まり」です。

14-3. Visual StudioとVS Codeはどちらがよい?

C#初心者やWindowsアプリ、業務アプリを作る場合はVisual Studioが使いやすいです。

Visual Studioは、プロジェクト作成、デバッグ、画面設計、NuGet管理などが統合されているため、C#開発に必要な機能がそろっています。

一方、VS Codeは軽量で、Web APIやコンソールアプリ、クラウド開発などに向いています。

初心者はVisual Studioから始め、慣れてきたら用途に応じてVS Codeも使うとよいでしょう。

14-4. コピペしたコードが動かないときは?

C#のサンプルコードをコピーして動かない場合は、まずエラーメッセージを確認しましょう。

よくある原因は、usingが不足している、クラス名が違う、メソッドの位置が違う、.NETのバージョンが違う、必要なパッケージが入っていない、ファイルパスが間違っている、などです。

たとえば、LINQを使う場合は次のusingが必要です。

C#
using System.Linq;

JSONを使う場合は次のusingが必要です。

C#
using System.Text.Json;

エラー文をそのまま検索するのも有効ですが、まずは「どの行で」「何が原因で」エラーになっているかを確認することが大切です。

14-5. 実務でよく使うC#文法は?

実務でよく使うC#文法は、基本文法に加えて、List、Dictionary、LINQ、クラス、interface、例外処理、非同期処理、JSON、ファイル操作です。

特にLINQは、データの抽出、変換、並び替え、集計で頻繁に使います。

C#
var activeUsers = users
.Where(u => u.IsActive)
.OrderBy(u => u.Name)
.ToList();

また、null対策や例外処理も実務では重要です。

C#
if (user == null)
{
throw new InvalidOperationException("ユーザーが見つかりません");
}

実務では、文法を知っているだけでなく、読みやすく、安全に、変更しやすいコードを書く力が求められます。

まとめ

C#は、基本文法から実務的な機能まで幅広く使えるプログラミング言語です。

この記事では、C#逆引きとして、変数、条件分岐、繰り返し、文字列操作、日付処理、配列、List、Dictionary、クラス、LINQ、ファイル操作、JSON、例外処理、非同期処理、HTTP通信などを目的別に紹介しました。

C#を効率よく覚えるには、文法を丸暗記するよりも、「やりたいこと」を小さなコードで試すことが大切です。

最初はサンプルコードをコピーして動かし、次に値や変数名を変え、最後に自分のアプリへ組み込んでみましょう。

C#逆引きを活用すれば、必要な文法をその場で確認しながら、実践的なプログラムを少しずつ書けるようになります。