C#のOR条件を完全解説|||・|・LINQで迷わない使い方とエラー対策
はじめに
C#で「AまたはB」を判定したいときは、基本的にOR条件を使います。
たとえば、次のような場面です。
C#if (role == "Admin" || role == "Manager")
{
Console.WriteLine("管理画面を表示します");
}
C#のOR条件では、主に次の書き方を使い分けます。
C#|| // 条件式で使う論理OR
| // boolでは非短絡OR、数値ではビットOR
or // パターンマッチングで使うorパターン
特に初心者が迷いやすいのは、「||」と「|」の違い、そして「or」とそのまま書ける場面・書けない場面です。
この記事では、C#のOR条件について、if文、LINQ、ビット演算、orパターン、よくあるエラーまでまとめて解説します。
1. C#のOR条件とは?まず押さえる「または」の基本
C#のOR条件とは、「複数の条件のうち、どれか1つでも成り立てばtrueにする」ための条件式です。
日本語でいうと「または」にあたります。
たとえば、次の条件を考えます。
C#年齢が20歳以上 または 会員ランクがGold
C#では次のように書けます。
C#if (age >= 20 || rank == "Gold")
{
Console.WriteLine("キャンペーン対象です");
}
この場合、age >= 20 がtrue、または rank == "Gold" がtrueであれば、if文の中が実行されます。
1-1. C#でOR条件を書くときは基本的に「||」を使う
C#で通常の条件分岐にOR条件を書く場合は、基本的に || を使います。
C#if (isMember || hasCoupon)
{
Console.WriteLine("割引できます");
}
|| は「論理OR演算子」と呼ばれます。
左右には、trueまたはfalseになる式を書きます。
C#bool isMember = true;
bool hasCoupon = false;
if (isMember || hasCoupon)
{
Console.WriteLine("割引対象です");
}
この例では、isMember がtrueなので、OR条件全体もtrueになります。
1-2. OR条件がtrueになるパターンを真理値表で確認
OR条件は、左右のどちらか一方でもtrueならtrueになります。
| 左辺 | 右辺 | 結果 |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
つまり、OR条件がfalseになるのは、すべての条件がfalseのときだけです。
C#bool a = false;
bool b = false;
Console.WriteLine(a || b); // false
一方、どちらかがtrueなら結果はtrueです。
C#bool a = true;
bool b = false;
Console.WriteLine(a || b); // true
1-3. if文で複数条件を「または」で判定する基本形
if文でOR条件を使う基本形は次のとおりです。
C#if (条件A || 条件B)
{
// 条件Aまたは条件Bがtrueのときに実行される
}
具体例を見てみましょう。
C#int score = 85;
bool isSpecialMember = false;
if (score >= 80 || isSpecialMember)
{
Console.WriteLine("合格です");
}
この場合、score >= 80 がtrueなので、isSpecialMember がfalseでもif文の中が実行されます。
OR条件は、「どれか1つでも該当すれば処理したい」ときに使います。
1-4. 「or」と書けないケースとC#で使えるorの違い
C#では、通常の条件式に英語の or は使えません。
次のコードはコンパイルエラーになります。
C#if (age >= 20 or isMember)
{
Console.WriteLine("対象です");
}
通常のif文では、次のように || を使います。
C#if (age >= 20 || isMember)
{
Console.WriteLine("対象です");
}
ただし、C#には or というキーワードが存在します。
それは、パターンマッチングで使う orパターン です。
C#if (value is 1 or 2 or 3)
{
Console.WriteLine("1、2、3のいずれかです");
}
つまり、C#では次のように考えると分かりやすいです。
C#// 通常の条件式
if (a || b) { }
// パターンマッチング
if (value is 1 or 2) { }
通常のOR条件では ||、パターンマッチングでは or を使います。
2. C#の「||」の使い方|もっともよく使うOR条件
|| は、C#でOR条件を書くときにもっともよく使う演算子です。
if文、while文、三項演算子、LINQのWhere句など、さまざまな場所で使えます。
2-1. if文で「AまたはB」を判定する書き方
もっとも基本的な使い方は、if文の条件式です。
C#string userType = "Guest";
bool hasInvitation = true;
if (userType == "Member" || hasInvitation)
{
Console.WriteLine("入場できます");
}
このコードでは、次のどちらかがtrueなら入場できます。
C#userType == "Member"
hasInvitation
hasInvitation がtrueなので、userType が "Member" でなくても条件全体はtrueです。
2-2. 3つ以上の条件をORでつなぐ書き方
OR条件は、3つ以上つなげることもできます。
C#if (status == "New" || status == "Pending" || status == "Retry")
{
Console.WriteLine("処理対象です");
}
このように書くと、status が "New"、"Pending"、"Retry" のいずれかならtrueになります。
ただし、条件が多くなると読みづらくなります。
その場合は、配列やリストを使うとすっきり書けます。
C#string[] targetStatuses = { "New", "Pending", "Retry" };
if (targetStatuses.Contains(status))
{
Console.WriteLine("処理対象です");
}
同じ値に対するOR条件が多い場合は、Contains を使うと読みやすくなります。
2-3. 比較演算子と組み合わせる実践例
OR条件は、比較演算子と組み合わせてよく使います。
C#int temperature = 35;
if (temperature < 0 || temperature >= 30)
{
Console.WriteLine("注意が必要な気温です");
}
この例では、気温が0度未満、または30度以上ならメッセージを表示します。
数値の範囲判定でもOR条件は便利です。
C#int score = 45;
if (score < 0 || score > 100)
{
Console.WriteLine("不正な点数です");
}
このコードでは、点数が0未満、または100より大きい場合に不正と判定します。
2-4. nullチェックや空文字チェックで使う例
OR条件は、nullチェックや空文字チェックでもよく使います。
C#string? name = null;
if (name == null || name == "")
{
Console.WriteLine("名前が入力されていません");
}
ただし、文字列がnullまたは空文字かを判定する場合は、string.IsNullOrEmpty を使う方が一般的です。
C#if (string.IsNullOrEmpty(name))
{
Console.WriteLine("名前が入力されていません");
}
空白文字だけの文字列も未入力扱いにしたい場合は、string.IsNullOrWhiteSpace を使います。
C#if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("名前が入力されていません");
}
また、|| は左辺がtrueなら右辺を評価しないため、次のようなnullチェックも安全に書けます。
C#if (text == null || text.Length == 0)
{
Console.WriteLine("テキストが空です");
}
text == null がtrueの場合、text.Length は評価されません。そのため、null参照例外を避けられます。
2-5. 「== true」は必要?読みやすい条件式の書き方
bool型の変数を条件式で使う場合、基本的に == true は不要です。
C#bool isActive = true;
// 冗長な書き方
if (isActive == true)
{
Console.WriteLine("有効です");
}
// シンプルな書き方
if (isActive)
{
Console.WriteLine("有効です");
}
OR条件でも同じです。
C#if (isAdmin || isOwner)
{
Console.WriteLine("編集できます");
}
次のように書く必要はありません。
C#if (isAdmin == true || isOwner == true)
{
Console.WriteLine("編集できます");
}
ただし、bool? のようなnullable boolでは、== true が役立つ場合があります。
C#bool? isApproved = null;
if (isApproved == true)
{
Console.WriteLine("承認済みです");
}
通常のboolでは if (flag)、nullable boolでは必要に応じて flag == true と考えると分かりやすいです。
3. 「||」と「|」の違い|短絡評価で迷わない判断基準
C#では、ORに似た演算子として || と | があります。
どちらもbool型に対して使えますが、大きな違いは「右辺を評価するかどうか」です。
C#条件A || 条件B
条件A | 条件B
普段の条件分岐では、基本的に || を使います。
3-1. 「||」は左辺がtrueなら右辺を評価しない
|| は短絡評価を行います。
短絡評価とは、結果が決まった時点で残りの条件を評価しない仕組みです。
C#bool A()
{
Console.WriteLine("A");
return true;
}
bool B()
{
Console.WriteLine("B");
return false;
}
if (A() || B())
{
Console.WriteLine("trueです");
}
この場合、A() がtrueを返した時点でOR条件全体はtrueと分かります。
そのため、B() は実行されません。
出力は次のようになります。
C#A
trueです
3-2. 「|」は左右どちらも必ず評価する
一方、bool型に対する | は、左右の条件を両方評価します。
C#if (A() | B())
{
Console.WriteLine("trueです");
}
この場合、A() がtrueでも B() が実行されます。
出力は次のようになります。
C#A
B
trueです
OR条件としての結果は似ていますが、メソッド呼び出しや副作用がある場合、動作が変わります。
3-3. bool型での「|」の使いどころ
bool型で | を使う場面は多くありません。
あえて使うとすれば、左右の処理を必ず実行したい場合です。
C#bool result1 = ValidateName(name);
bool result2 = ValidateEmail(email);
if (result1 | result2)
{
Console.WriteLine("少なくとも1つは有効です");
}
ただし、このような場合でも、先に変数へ代入してから || を使う方が意図が明確です。
C#bool isNameValid = ValidateName(name);
bool isEmailValid = ValidateEmail(email);
if (isNameValid || isEmailValid)
{
Console.WriteLine("少なくとも1つは有効です");
}
条件式の中で | を使うと、読み手が「書き間違いではないか」と感じることもあります。
3-4. 副作用のあるメソッドを条件に入れるときの注意点
副作用とは、値を返す以外に何らかの処理を行うことです。
たとえば、ログ出力、DB更新、カウント増加、外部API呼び出しなどです。
C#if (IsLoggedIn() || RecordAccess())
{
Console.WriteLine("アクセス処理");
}
この場合、IsLoggedIn() がtrueなら RecordAccess() は実行されません。
もし RecordAccess() を必ず実行したいなら、条件式とは分けるべきです。
C#bool isLoggedIn = IsLoggedIn();
bool recorded = RecordAccess();
if (isLoggedIn || recorded)
{
Console.WriteLine("アクセス処理");
}
OR条件の中に副作用のある処理を直接書くと、短絡評価によって想定外に実行されないことがあります。
3-5. 基本は「||」を使うべき理由
通常の条件分岐では、基本的に || を使うべきです。
理由は次のとおりです。
| 演算子 | 特徴 | 主な用途 |
|---|---|---|
| ` | ` | |
| ` | ` | 左右を必ず評価する |
|| は、不要な処理を避けられます。
また、nullチェックのように、左辺で安全性を確認してから右辺を評価する書き方にも向いています。
C#if (user == null || user.IsDeleted)
{
return;
}
このようなコードでは、|| を使うことでnull参照を防げます。
4. C#の「|」はビット演算にも使う|OR条件との混同を防ぐ
C#の | は、bool型だけでなく、整数型やenumに対しても使われます。
数値に対して使う場合、| は「ビットごとのOR演算」を意味します。
4-1. bool型の「|」と数値型の「|」は意味が違う
bool型での | は、左右のbool値をOR条件として評価します。
C#bool result = true | false; // true
一方、数値型での | は、各ビットを比較してOR演算を行います。
C#int result = 1 | 2; // 3
これは、2進数で考えると分かりやすいです。
C#1 = 0001
2 = 0010
3 = 0011
各ビットのどちらかが1なら、結果のビットも1になります。
4-2. ビットごとのOR演算の基本
ビットORでは、対応するビットのどちらかが1なら1になります。
| 左ビット | 右ビット | 結果 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
たとえば、次のコードを見てみます。
C#int a = 5; // 0101
int b = 3; // 0011
int result = a | b; // 0111 = 7
Console.WriteLine(result); // 7
このように、数値に対する | は条件分岐のORではなく、ビット単位の演算です。
4-3. フラグ enum で「|」を使う例
| は、フラグenumでよく使われます。
C#[Flags]
enum Permission
{
None = 0,
Read = 1,
Write = 2,
Delete = 4
}
複数の権限を組み合わせるときに | を使います。
C#Permission permission = Permission.Read | Permission.Write;
Console.WriteLine(permission); // Read, Write
特定の権限を持っているか確認するには、HasFlag を使えます。
C#if (permission.HasFlag(Permission.Read))
{
Console.WriteLine("読み取り可能です");
}
ビット演算で確認することもできます。
C#if ((permission & Permission.Read) == Permission.Read)
{
Console.WriteLine("読み取り可能です");
}
フラグenumでは、| は「条件のOR」ではなく「値の組み合わせ」に使われます。
4-4. 条件分岐で「|」を使ってしまうミスの見分け方
条件分岐で次のようなコードを見たら注意が必要です。
C#if (user == null | user.IsDeleted)
{
return;
}
このコードでは、user == null がtrueでも user.IsDeleted が評価されます。
そのため、user がnullの場合に例外が発生します。
正しくは || を使います。
C#if (user == null || user.IsDeleted)
{
return;
}
条件分岐で | を見つけたら、次の点を確認しましょう。
C#本当に右辺も必ず評価したいのか
数値やenumのビット演算ではないか
単なる「||」の書き間違いではないか
通常のif文でOR条件を書くなら、ほとんどの場合は || が正解です。
5. LINQでOR条件を書く方法
LINQでも、OR条件はよく使います。
Where の中で || を使えば、複数条件のうちどれかに一致するデータを抽出できます。
5-1. Where句でOR条件を使う基本
たとえば、商品一覧から「価格が1000円以下、または在庫がある商品」を抽出する場合です。
C#var results = products
.Where(p => p.Price <= 1000 || p.InStock)
.ToList();
この条件では、次のどちらかを満たす商品が取得されます。
C#p.Price <= 1000
p.InStock
LINQの Where の中でも、通常のC#と同じように || を使えます。
5-2. 複数キーワード検索をOR条件で実装する
複数のキーワードのいずれかに一致するデータを探す場合も、OR条件を使います。
C#string keyword1 = "C#";
string keyword2 = "LINQ";
var articles = allArticles
.Where(a => a.Title.Contains(keyword1) || a.Title.Contains(keyword2))
.ToList();
このコードでは、タイトルに "C#" または "LINQ" を含む記事を取得します。
条件が少ない場合は、この書き方で問題ありません。
ただし、キーワードが増える場合は、配列と Any を使うと管理しやすくなります。
5-3. Containsを使ったOR条件の書き方
同じプロパティに対して複数の値を比較する場合は、Contains を使うと簡潔です。
C#var targetCategories = new[] { "Book", "Game", "Movie" };
var results = products
.Where(p => targetCategories.Contains(p.Category))
.ToList();
これは、次のOR条件と同じ意味です。
C#var results = products
.Where(p => p.Category == "Book"
|| p.Category == "Game"
|| p.Category == "Movie")
.ToList();
値の候補が増える場合は、Contains を使った方が読みやすく、保守しやすくなります。
5-4. Anyを使って複数条件をすっきり書く
複数キーワードのどれかを含むか調べるなら、Any が便利です。
C#var keywords = new[] { "C#", "OR", "LINQ" };
var results = articles
.Where(a => keywords.Any(k => a.Title.Contains(k)))
.ToList();
このコードでは、keywords のいずれかがタイトルに含まれていればtrueになります。
本文も検索対象に含めたい場合は、次のように書けます。
C#var results = articles
.Where(a => keywords.Any(k =>
a.Title.Contains(k) || a.Body.Contains(k)))
.ToList();
Any は、「コレクションの中に1つでも条件を満たす要素があるか」を判定するメソッドです。
5-5. AND条件とOR条件を組み合わせるときの括弧の付け方
LINQでAND条件とOR条件を組み合わせる場合は、括弧を付けて条件のまとまりを明確にしましょう。
たとえば、「公開済みの記事のうち、タイトルにC#またはLINQを含むもの」を取得する場合です。
C#var results = articles
.Where(a => a.IsPublished &&
(a.Title.Contains("C#") || a.Title.Contains("LINQ")))
.ToList();
括弧を付けないと、意図と違う条件になることがあります。
C#var results = articles
.Where(a => a.IsPublished && a.Title.Contains("C#")
|| a.Title.Contains("LINQ"))
.ToList();
この場合、a.Title.Contains("LINQ") がtrueなら、IsPublished がfalseでも取得される可能性があります。
ANDとORが混ざるときは、必ず括弧でまとまりを示すのがおすすめです。
5-6. LINQ to EntitiesでOR条件を書くときの注意点
Entity FrameworkなどのLINQ to EntitiesでOR条件を書く場合は、SQLに変換できる形で書く必要があります。
たとえば、次のようなコードは一般的にSQLへ変換されやすいです。
C#var results = db.Products
.Where(p => p.Category == "Book" || p.Category == "Game")
.ToList();
Contains を使った条件も、環境によってはSQLの IN のような形に変換されます。
C#var categories = new[] { "Book", "Game" };
var results = db.Products
.Where(p => categories.Contains(p.Category))
.ToList();
注意したいのは、独自メソッドを条件式の中で呼び出すケースです。
C#var results = db.Products
.Where(p => IsTargetCategory(p.Category))
.ToList();
このようなメソッドはSQLに変換できず、エラーになることがあります。
LINQ to Entitiesでは、OR条件そのものよりも、「その条件がデータベース側で解釈できるか」が重要です。
複雑な条件を書く場合は、まずシンプルな比較、Contains、Any などで表現できないかを考えましょう。
6. C#のOR条件でよくあるエラーと原因
C#のOR条件では、書き方を少し間違えるだけでコンパイルエラーや実行時エラーにつながります。
ここでは、特によくあるミスを紹介します。
6-1. 「or」と書いてコンパイルエラーになる
通常の条件式で or と書くとエラーになります。
C#if (age >= 20 or isMember)
{
Console.WriteLine("対象です");
}
正しくは || です。
C#if (age >= 20 || isMember)
{
Console.WriteLine("対象です");
}
C#の or は、通常のif条件ではなく、パターンマッチングで使います。
C#if (status is "New" or "Pending")
{
Console.WriteLine("処理対象です");
}
「csharp or」と調べている場合は、通常のOR条件としての || と、パターンマッチングの or を分けて理解することが大切です。
6-2. 条件式を左右両方に書かずにエラーになる
次のような書き方は、初心者がよくやりがちなミスです。
C#if (status == "New" || "Pending")
{
Console.WriteLine("処理対象です");
}
C#では、|| の左右にはbool型の式が必要です。
"Pending" は文字列であり、trueまたはfalseではありません。
正しくは、左右両方に比較式を書きます。
C#if (status == "New" || status == "Pending")
{
Console.WriteLine("処理対象です");
}
同じ変数に対する比較が多い場合は、Contains を使うとミスを減らせます。
C#if (new[] { "New", "Pending" }.Contains(status))
{
Console.WriteLine("処理対象です");
}
6-3. 「||」をbool以外に使ってエラーになる
|| はbool型の条件式に使う演算子です。
数値や文字列をそのまま左右に置くことはできません。
C#int x = 1;
int y = 2;
if (x || y)
{
Console.WriteLine("エラーになります");
}
このコードはコンパイルできません。
数値を条件にしたい場合は、比較式にします。
C#if (x > 0 || y > 0)
{
Console.WriteLine("どちらかが正の数です");
}
文字列でも同じです。
C#string name = "";
if (name == null || name == "")
{
Console.WriteLine("未入力です");
}
または、次のように書きます。
C#if (string.IsNullOrEmpty(name))
{
Console.WriteLine("未入力です");
}
6-4. 「|」と「||」を間違えて想定外の処理が実行される
| と || は見た目が似ていますが、動作が異なります。
C#if (IsValid() | SaveLog())
{
Console.WriteLine("処理しました");
}
この場合、IsValid() がtrueでも SaveLog() は実行されます。
一方、|| なら左辺がtrueのとき右辺は評価されません。
C#if (IsValid() || SaveLog())
{
Console.WriteLine("処理しました");
}
副作用のあるメソッドを条件式に入れている場合、| と || の違いがバグの原因になります。
通常の条件分岐では、まず || を使うと覚えておきましょう。
6-5. 演算子の優先順位で判定結果が変わる
C#では、&& の方が || より優先順位が高いです。
そのため、次のコードは、
C#if (isAdmin || isOwner && isActive)
{
Console.WriteLine("操作できます");
}
次のように解釈されます。
C#if (isAdmin || (isOwner && isActive))
{
Console.WriteLine("操作できます");
}
もし、「管理者または所有者」で、かつ「有効なユーザー」の場合にしたいなら、括弧が必要です。
C#if ((isAdmin || isOwner) && isActive)
{
Console.WriteLine("操作できます");
}
AND条件とOR条件が混ざる場合は、優先順位に頼らず括弧を書く方が安全です。
6-6. null参照が発生するOR条件の書き方
OR条件では、nullチェックの順番が重要です。
次のコードは危険です。
C#if (user.IsDeleted || user == null)
{
return;
}
user がnullの場合、先に user.IsDeleted が評価されるため、null参照例外が発生します。
正しくは、nullチェックを先に書きます。
C#if (user == null || user.IsDeleted)
{
return;
}
|| は左辺がtrueなら右辺を評価しないため、user == null がtrueのとき user.IsDeleted は実行されません。
nullチェックとOR条件を組み合わせるときは、「安全確認を先に書く」と覚えましょう。
7. OR条件を安全に書くための実践テクニック
OR条件は便利ですが、条件が増えるほど読みづらくなります。
安全で保守しやすいコードにするには、書き方を工夫することが大切です。
7-1. 括弧を使って条件のまとまりを明確にする
AND条件とOR条件が混ざる場合は、括弧を使いましょう。
C#if ((role == "Admin" || role == "Manager") && isActive)
{
Console.WriteLine("管理機能を利用できます");
}
このコードは、「AdminまたはManagerであり、かつ有効なユーザー」という意味です。
括弧がないと、読み手が条件を誤解する可能性があります。
C#if (role == "Admin" || role == "Manager" && isActive)
{
Console.WriteLine("管理機能を利用できます");
}
C#の優先順位を知っていても、複雑な条件では括弧を付ける方が親切です。
7-2. 複雑な条件は変数に分けて読みやすくする
条件式が長くなったら、意味のある変数に分けましょう。
C#bool isPrivilegedUser = role == "Admin" || role == "Manager";
bool canAccess = isPrivilegedUser && isActive;
if (canAccess)
{
Console.WriteLine("アクセスできます");
}
このように分けると、条件の意味が読み取りやすくなります。
悪い例は次のようなコードです。
C#if ((role == "Admin" || role == "Manager") && isActive && !isLocked && loginCount > 0)
{
Console.WriteLine("アクセスできます");
}
一行で書けても、すぐに理解しづらい条件式は保守性が下がります。
変数名で条件の意味を表現すると、コード全体が分かりやすくなります。
7-3. メソッド化して条件式の意味を明確にする
条件が複数箇所で使われる場合は、メソッド化するのも有効です。
C#bool IsPrivilegedRole(string role)
{
return role == "Admin" || role == "Manager";
}
使う側はシンプルになります。
C#if (IsPrivilegedRole(role) && isActive)
{
Console.WriteLine("管理機能を利用できます");
}
条件式をメソッド化すると、次のメリットがあります。
| メリット | 内容 |
|---|---|
| 読みやすい | 条件の意味がメソッド名で分かる |
| 再利用しやすい | 同じ条件を複数箇所で使える |
| 修正しやすい | 条件変更時に修正箇所を集約できる |
| テストしやすい | 条件だけを単体テストしやすい |
OR条件が長くなる場合は、メソッド化を検討しましょう。
7-4. De Morganの法則で否定条件を整理する
OR条件に否定が絡むと、読みづらくなることがあります。
たとえば、次の条件を見てください。
C#if (!(isAdmin || isOwner))
{
Console.WriteLine("権限がありません");
}
これは、「AdminでもOwnerでもない」という意味です。
De Morganの法則を使うと、次のように書き換えられます。
C#if (!isAdmin && !isOwner)
{
Console.WriteLine("権限がありません");
}
De Morganの法則では、次のように変換できます。
C#!(A || B) は !A && !B
!(A && B) は !A || !B
どちらが読みやすいかは状況によります。
ただし、否定とOR条件が重なって分かりにくい場合は、条件を変数に分けると安全です。
C#bool hasPermission = isAdmin || isOwner;
if (!hasPermission)
{
Console.WriteLine("権限がありません");
}
7-5. 単体テストでOR条件の抜け漏れを防ぐ
OR条件は、「どれか1つでもtrueならtrue」という性質があります。
そのため、条件ごとのパターンをテストすると抜け漏れを防げます。
C#bool CanAccess(bool isAdmin, bool isOwner)
{
return isAdmin || isOwner;
}
テストすべきパターンは次の4つです。
| isAdmin | isOwner | 期待結果 |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
条件が3つになると、組み合わせはさらに増えます。
すべての組み合わせを毎回細かく書く必要はありませんが、重要な分岐では、trueになるパターンとfalseになるパターンを確認しておくと安心です。
8. C#のorパターンとは?「||」との違い
C#には、|| とは別に or を使う書き方があります。
それが、パターンマッチングの orパターン です。
通常の条件式では ||、パターンの組み合わせでは or を使います。
8-1. パターンマッチングで使う「or」の基本
or パターンは、「複数のパターンのどれかに一致するか」を判定します。
C#int value = 2;
if (value is 1 or 2 or 3)
{
Console.WriteLine("1、2、3のいずれかです");
}
これは、次の条件式と近い意味です。
C#if (value == 1 || value == 2 || value == 3)
{
Console.WriteLine("1、2、3のいずれかです");
}
ただし、or は条件式の演算子ではなく、パターンをつなぐための構文です。
8-2. is式で複数パターンを判定する例
is 式では、型や値のパターンに対して or を使えます。
C#object value = "hello";
if (value is string or char[])
{
Console.WriteLine("文字列として扱える可能性があります");
}
値の範囲と組み合わせることもできます。
C#int score = 95;
if (score is < 0 or > 100)
{
Console.WriteLine("不正な点数です");
}
これは、次のコードと似ています。
C#if (score < 0 || score > 100)
{
Console.WriteLine("不正な点数です");
}
パターンマッチングでは、条件の意味を直感的に表現できることがあります。
8-3. switch式でorパターンを使う例
switch 式でも or パターンを使えます。
C#string GetCategory(int statusCode)
{
return statusCode switch
{
200 or 201 or 204 => "Success",
400 or 401 or 403 or 404 => "Client Error",
500 or 502 or 503 => "Server Error",
_ => "Other"
};
}
複数の値に対して同じ結果を返したい場合、or パターンを使うと簡潔に書けます。
曜日の判定にも使えます。
C#string GetDayType(DayOfWeek day)
{
return day switch
{
DayOfWeek.Saturday or DayOfWeek.Sunday => "休日",
_ => "平日"
};
}
このように、switch 式では or パターンが特に便利です。
8-4. 「||」とorパターンを使い分ける基準
|| と or パターンは似ていますが、使う場所が違います。
| 書き方 | 使う場所 | 例 |
|---|---|---|
| ` | ` | |
or | パターンマッチング | if (x is 1 or 2) |
| ` | ` | boolの非短絡OR、ビットOR |
通常のif文で複数のbool条件を判定するなら || です。
C#if (isAdmin || isOwner)
{
Console.WriteLine("権限あり");
}
値が複数のパターンに一致するかを見たいなら or パターンが使えます。
C#if (role is "Admin" or "Owner")
{
Console.WriteLine("権限あり");
}
単純な比較ならどちらでも表現できることがありますが、チームのコーディング規約や読みやすさに合わせて選びましょう。
9. C#のOR条件に関するよくある質問
C#のOR条件では、||、|、or の違いに関する疑問が多くあります。
ここでは、よくある質問をまとめます。
9-1. C#で「または」は何と書く?
通常の条件式で「または」を書く場合は、|| を使います。
C#if (age >= 20 || isMember)
{
Console.WriteLine("対象です");
}
パターンマッチングでは or を使えます。
C#if (value is 1 or 2 or 3)
{
Console.WriteLine("1、2、3のいずれかです");
}
基本は ||、パターンでは or と覚えると分かりやすいです。
9-2. 「||」と「|」はどちらを使えばいい?
通常のif文では || を使います。
C#if (isValid || isAdmin)
{
Console.WriteLine("OK");
}
|| は左辺がtrueなら右辺を評価しないため、効率がよく、nullチェックにも向いています。
| は、bool型では左右を必ず評価するOR、数値型やenumではビットORとして使われます。
C#Permission permission = Permission.Read | Permission.Write;
条件分岐で迷ったら、基本は || を選びましょう。
9-3. OR条件を3つ以上書いても問題ない?
OR条件を3つ以上書いても問題ありません。
C#if (status == "New" || status == "Pending" || status == "Retry")
{
Console.WriteLine("処理対象です");
}
ただし、条件が増えると読みづらくなります。
同じ変数を複数の値と比較するなら、Contains を使うとすっきりします。
C#var statuses = new[] { "New", "Pending", "Retry" };
if (statuses.Contains(status))
{
Console.WriteLine("処理対象です");
}
条件の意味が複雑なら、変数やメソッドに分けるのがおすすめです。
9-4. LINQでOR条件を動的に増やすには?
キーワードの数が動的に変わる場合は、Any を使う方法が簡単です。
C#var keywords = new[] { "C#", "LINQ", "OR" };
var results = articles
.Where(a => keywords.Any(k => a.Title.Contains(k)))
.ToList();
同じプロパティが候補値のいずれかに一致するかを調べるなら、Contains が便利です。
C#var categories = new[] { "Book", "Game", "Movie" };
var results = products
.Where(p => categories.Contains(p.Category))
.ToList();
Entity Frameworkなどで動的なOR条件をさらに細かく組み立てる場合は、式木を使って条件を組み立てる方法もあります。
ただし、まずは Any や Contains で表現できないかを考えるとよいでしょう。
9-5. AND条件とOR条件が混ざるときの注意点
AND条件とOR条件が混ざる場合は、括弧を付けて意図を明確にしましょう。
C#if ((isAdmin || isOwner) && isActive)
{
Console.WriteLine("操作できます");
}
括弧がない場合、&& が || より先に評価されます。
C#if (isAdmin || isOwner && isActive)
{
Console.WriteLine("操作できます");
}
これは次のように解釈されます。
C#if (isAdmin || (isOwner && isActive))
{
Console.WriteLine("操作できます");
}
意図しない判定を防ぐために、ANDとORが混ざる条件では括弧を付ける習慣を持ちましょう。
まとめ
C#でOR条件を書くときは、基本的に || を使います。
C#if (conditionA || conditionB)
{
// conditionA または conditionB がtrueなら実行
}
|| は短絡評価を行うため、左辺がtrueなら右辺を評価しません。
そのため、nullチェックや不要な処理の回避に向いています。
C#if (user == null || user.IsDeleted)
{
return;
}
一方、| はbool型では左右を必ず評価するOR、数値型やenumではビットORとして使われます。
C#Permission permission = Permission.Read | Permission.Write;
通常の条件分岐で | を使うと、右辺が想定外に実行されることがあるため注意が必要です。
また、C#には or パターンもあります。
C#if (value is 1 or 2 or 3)
{
Console.WriteLine("一致しました");
}
ただし、or は通常のif条件で使う論理演算子ではなく、パターンマッチング用の構文です。
C#のOR条件は、次のように使い分けると迷いません。
| 書き方 | 用途 |
|---|---|
| ` | |
| ` | ` |
or | パターンマッチングのorパターン |
普段のif文やLINQでは || を使い、ビット演算やフラグenumでは |、パターンマッチングでは or を使うと覚えておきましょう。

