-
C#で数値が2の累乗かどうかを判定する方法をわかりやすく解説
「2の累乗」とは、整数 n を用いて 2n の形で表せる数のことです。つまり、基数を2、指数を整数 n としてべき乗計算を行った結果の値を指します。代表的な2の累乗は以下の表のとおりです。n2n01122438416532このように、n = 0 のときは 20 = 1 となる点に注意してください。1 もまた2の累乗に含まれます。C#で数値が2の累乗かどうかを判定するには、主に2つのアプローチがあります。それぞれサンプルコードとともに見ていきましょう。方法1:ビット演算を使う(高速・定番)2の累乗である数をバイナリで表すと、最上位ビットだけが1になり、それ以外はすべて0になります。例えば、8 は
-
【C#】DateTimeを「YYYYMMDDHHMMSS」形式の文字列に変換する方法
C#でDateTime型の日時を「YYYYMMDDHHMMSS」形式の文字列に変換したい場合、ToString()メソッドにカスタム書式指定文字列「yyyyMMddHHmmss」を渡すだけで簡単に実現できます。 基本的な変換方法 以下のコードは、現在日時を取得し、「YYYYMMDDHHMMSS」形式(例:20200727080325)の文字列へ変換するサンプルです。 class Program { static void Main() { DateTime d = DateTime.Now; string dateString = d.ToString(
-
C#でフォルダが存在しない場合に新しく作成する方法
ディレクトリを作成するには、まずC#でSystem.IO名前空間をインポートする必要があります。この名前空間は、ディレクトリの作成・コピー・移動・削除などを行うための静的メソッドを提供するライブラリです。また、C#でファイル操作を行う前に、対象のディレクトリが存在するかどうかを必ず確認することをお勧めします。フォルダが存在しない状態で操作を行うと、実行時に例外がスローされてしまうためです。例1:単一フォルダを作成するusing System; using System.IO; namespace DemoApplication { class Program { &n
-
C#で文字列が数値かどうかを判定する方法 ― int.TryParseとint.Parseの違い
C#で文字列が有効な数値であるかどうかを検証するには、int.TryParseメソッドまたはint.Parseメソッドを使用します。どちらも文字列を整数に変換できますが、変換に失敗したときの挙動が大きく異なります。int.Parse:文字列を整数に変換できない場合、例外(FormatException)をスローします。int.TryParse:変換の成否をbool値で返します。成功ならtrue、失敗ならfalseとなるため、例外処理を書かずに済み、安全に検証できます。また、outパラメータで変換後の数値を受け取ることができます。サンプルコード1:有効な数値文字列の場合using System;
-
C#のFuncデリゲートとActionデリゲートの違いとは?使い方をコード例付きで解説
デリゲート(delegate)とは、特定のパラメータリストと戻り値の型を持つメソッドへの参照を表す型です。デリゲートをインスタンス化すると、互換性のあるシグネチャと戻り値の型を持つ任意のメソッドとそのインスタンスを関連付けられ、デリゲートのインスタンスを通じてそのメソッドを呼び出すことができます。 Funcデリゲートとは Funcは、System名前空間に含まれる汎用デリゲートです。0個以上の入力パラメータと1つの出力パラメータ(戻り値)を持ち、最後の型引数が戻り値の型として扱われます。このデリゲートは、最大16個のパラメータを受け取り、値を返すメソッドを参照できます。 以下は、2つの入力パラ
-
C#でバイト配列をストリームに変換する方法|MemoryStreamの使い方を解説
C#におけるStream(ストリーム)は、すべてのストリームクラスの抽象基底クラスであり、バイト列に対する汎用的なビューを提供します。ストリームオブジェクトは、「読み込み(Reading)」「書き込み(Writing)」「シーク(Seeking)」という3つの基本操作をサポートしており、必要に応じて位置をリセットできるため、パフォーマンスの向上にもつながります。バイト配列からMemoryStreamへの変換バイト配列(byte配列)は、MemoryStreamクラスを使うことで簡単にメモリストリームへ変換できます。コンストラクタにバイト配列を渡すだけで、その内容を保持するストリームが生成されま
-
C#のユニットテストでスローされた例外を検証する2つの方法
C#の単体テスト(ユニットテスト)では、メソッドが正しく例外をスローすることを確認する場面がよくあります。MSTestフレームワークでは、主に次の2つの方法で例外を検証できます。Assert.ThrowsException を使用する方法ExpectedException属性 を使用する方法テスト対象となるサンプルコードここでは、常に例外をスローする StringAppend メソッドを例に、その例外をテストする方法を見ていきましょう。using System; namespace DemoApplication { public class Program { sta
-
C#で文字列リストをカンマ区切りの文字列に変換する方法
C#では、string.Joinメソッドを使うことで、文字列のList(リスト)を簡単にカンマ区切りの1つの文字列へ変換できます。string.Join(,, list);このような変換は、ユーザーが入力した複数のデータ(例:チェックボックスで選択された項目など)をまとめてカンマ区切りの文字列にし、データベースへのクエリ発行や後続の処理に利用したい場合に非常に便利です。基本的な使用例以下は、果物名を格納したList<string>をカンマ区切りの文字列に変換するシンプルな例です。using System; using System.Collections.Generic; nam
-
C#の「コレクションが変更されました。列挙操作は実行されない可能性があります」エラーの原因と解決策
C#で foreach ループを使ってコレクション(例:List<T>)を列挙している最中に、そのコレクションへ要素の追加や削除といった変更を加えると、実行時に以下の例外がスローされます。 Exception: Collection was modified; enumeration operation may not execute. (例外:コレクションが変更されました。列挙操作は実行されない可能性があります。) エラーが発生する理由 foreach は内部で列挙子(Enumerator)を取得し、それを使ってコレクションを先頭から順番に走査します。List<T>
-
【C#】バイト配列を文字列に変換する方法をわかりやすく解説
.NETでは、すべての文字列に文字セットとエンコーディングが関連付けられています。文字エンコーディングとは、コンピュータに対して「0と1の生データをどのように実際の文字として解釈するか」を指示するためのルールです。一般的には数値と文字を対応付けることでこれを実現しており、端的に言えば「一連のUnicode文字をバイト列へ変換する処理」のことを指します。 Encoding.GetStringメソッドによる変換 指定したバイト配列内のすべてのバイトを文字列にデコードするには、Encoding.GetStringメソッド(Byte[])を使用します。Encodingクラスには、UTF8、Unicod
-
C#でリフレクションを使ってプロパティ値を動的に取得する方法
C#ではリフレクション(Reflection)を活用することで、プロパティの値を動的に取得できます。リフレクションは、アセンブリ・モジュール・型を記述するオブジェクト(Type型)を提供します。これにより、実行時に型のインスタンスを動的に生成したり、既存のオブジェクトから型情報を取得してメソッドを呼び出したり、フィールドやプロパティへアクセスしたりすることが可能になります。さらに、コード内で属性(Attribute)を使用している場合も、リフレクション経由でそれらにアクセスできます。.NETのリフレクションにおいて中心的な役割を担うのが、System.Reflection名前空間とSystem
-
C#で指定したパス内のすべてのファイルとフォルダーを削除する方法
はじめにC#では、System.IO 名前空間を利用することで、指定したパス配下のすべてのフォルダーとファイルを簡単に削除できます。特に DirectoryInfo クラスを使うと、ディレクトリ内のサブディレクトリやファイルの詳細情報を取得できるため、一括削除処理の実装に便利です。サンプルコードここでは、「Demo」というディレクトリの中に2つのサブディレクトリといくつかのファイルが存在する場合を例に説明します。using System.IO; namespace DemoApplication { class Program { &nbs
-
C#のint.Parse()とConvert.ToInt32の違いとは?null値の扱いを徹底解説
C#では、文字列として表現された数値を整数(int型)に変換する際に、int.ParseメソッドまたはConvert.ToInt32メソッドを使用します。どちらも同じ目的で使われますが、変換できない入力が渡された場合の挙動に重要な違いがあります。 int.ParseとConvert.ToInt32の主な違い 両者の最大の相違点はnull値の扱いです。 Convert.ToInt32:null値を許容します。引数がnullの場合でも例外をスローせず、0を返します。 int.Parse:null値を許容しません。引数がnullの場合、ArgumentNullException(System.A
-
C#でLINQを使用してコレクションの値を更新する方法
C#でコレクションの要素を更新したい場合、LINQの機能を活用するとコードを簡潔に記述できます。コレクションがList<T>型であれば、LINQに含まれるForEach拡張メソッドを利用するのが最も手軽な方法です。 ForEach拡張メソッドですべての要素を更新する ForEach拡張メソッドは、リストの各要素に対して引数として渡したラムダ式の処理を実行します。以下の例では、リスト内のすべての果物(Fruit)オブジェクトのSizeプロパティを「Large」に一括で変更しています。 using System; using System.Collections.Generic; n
-
C#で文字列の改行コードを置換・削除する方法(ReplaceとRegexの使い方)
C#で文字列を扱う際、テキストデータに含まれる改行コード(\n や \r)やタブ文字(\t)を除去したり、別の文字に置き換えたりしたいケースはよくあります。例えば、外部ファイルから読み込んだテキストを整形したい場合や、ログデータを加工したい場合などが挙げられます。ここでは、次のような改行やタブを含む文字列から、それらを取り除く方法を2つのアプローチで解説します。方法1:Replace()メソッドを使う最もシンプルな方法は、stringクラスが提供するReplace()メソッドを使用することです。置き換えたい文字列を指定して、新しい文字列に置換できます。複数種類の改行コードに対応する場合は、メソ
-
C#であるリストに存在しない要素を別のリストから抽出する方法
LINQのExcept演算子は、LINQにおける「セット演算子(Set Operators)」カテゴリに分類される演算子です。 Except()メソッドは2つのコレクションを引数として受け取り、最初のコレクションの中から、2番目のコレクションに存在しない要素を抽出します。 ただし注意点があります。Except拡張メソッドは、クラスのような複合型(参照型)のコレクションに対しては、既定では参照の等価性で比較を行うため、期待どおりの結果を返さないことがあります。複合型を扱う場合は、後半で紹介するWhere句を使った方法が有効です。 Except()メソッドを使用した例 まずは、文字列のリストをE
-
C#でディレクトリの内容を丸ごとコピーする方法(サブフォルダ・ファイルも含む)
ディレクトリの内容全体をコピーする場合、最も重要なのはサブディレクトリ(サブフォルダ)やその中に関連するファイルも含めて確実にコピーすることです。C#ではDirectoryInfoクラスと再帰処理を組み合わせることで、これをシンプルに実現できます。 例:コピー元とコピー先の準備 まず、以下のようにサブディレクトリとファイルを含むデモ用のソースディレクトリ(コピー元)を想定します。 一方、コピー先(ターゲット)となるディレクトリは、初期状態では空であるとします。 サンプルコード 以下のコードでは、CopyAllメソッドを定義し、ファイルのコピーとサブディレクトリの再帰的なコピ
-
C#のジェネリックメソッドからnullを返す方法:default(T)の使い方
ジェネリック(Generics)を使うと、フィールド、メソッド、パラメータなどの型をプレースホルダー(型パラメータ)として持つクラスを定義できます。これらのプレースホルダーは、コンパイル時に具体的な型へと置き換えられます。ジェネリックは山括弧 <> を使って定義するのが基本です。C#のコレクションにおける主な制限の一つは、効果的な型チェックが行えないことです。C#ではすべてのクラスがobject基底クラスから派生しているため、コレクションには原理的にどんなオブジェクトでも格納できてしまいます。さらに、通常のメソッドとは異なり、ジェネリックメソッドから単純にnullを返すことはできま
-
C#のyield returnとは?使い方と動作の仕組みをわかりやすく解説
C#のyieldキーワードを使うと、コレクションに対して「状態を保持しながら」独自の反復処理(ステートフルなイテレーション)を行うことができます。つまり、yieldキーワードを使用すると、呼び出し元のメソッドとデータ元の間で制御が行き来するのです。 サンプルコード using System; using System.Collections.Generic; namespace DemoApplication { class Program { static List<int> numbersList = new List<int> {
-
C# LINQのLast()とLastOrDefault()の違いとは?使い分けのポイントを解説
C#のLINQにおけるLast()とLastOrDefault()は、どちらもシーケンス(コレクション)の中から指定した条件に一致する最後の要素を取得するメソッドです。しかし、両者には重要な違いがあります。 Last()は、指定した条件に一致する要素が1つも存在しない場合に例外(InvalidOperationException)をスローします。一方、LastOrDefault()は一致する要素が存在しない場合でも例外をスローせず、既定値(参照型の場合はnull)を返します。 Last()とLastOrDefault()の使い分け Last():シーケンスに必ず1つ以上の一致する要素が存在す