C# のスニペット集

このページは、C# のスニペットなどをまとめる予定のページです。

目次

注意

  • コードのライセンスは CC0 (クレジット表示不要、改変可、商用可) です。

スニペット

DateTimeOffset

異なるタイムゾーンの日時の生成・比較

//using System.Runtime.InteropServices;

            TimeZoneInfo jstTimeZone = null; // JST タイムゾーン
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) // Windows
            {
                jstTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
            }
            else // Linux, Mac
            {
                jstTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo");
            }
            var startDateJst = new DateTimeOffset(2020, 5, 1, 0, 0, 0, jstTimeZone.BaseUtcOffset); // JST。2020/05/01 00:00:00 +9:00
            var endDateJst = startDateJst.AddDays(1); // 1日後

            var dateUtc1 = new DateTimeOffset(2020, 4, 30, 15, 0, 0, new TimeSpan()); // UTC。2020/04/30 15:00:00 +00:00
            if (startDateJst <= dateUtc1 && dateUtc1 < endDateJst) // JST 5/1~5/2 内か確認
            {
                Console.WriteLine(dateUtc1); // 2020/04/30 15:00:00 +00:00
                Console.WriteLine(dateUtc1.ToOffset(jstTimeZone.BaseUtcOffset)); // UTC→JST 変換。2020/05/01 00:00:00 +9:00
            }

TCP

クライアントとして受信を繰り返す

        /// <summary>サーバーのIPアドレス</summary>
        string Address = "127.0.0.1";
        /// <summary>サーバーの接続ポート</summary>
        int Port = 4000;
        /// <summary>接続中フラグ</summary>
        bool Connecting = false;

        /// <summary>
        /// TCP クライアントとして TCP 接続を行い、接続終了が指示 (Connecting == false) されるかエラーになるまで受信を繰り返します。
        /// </summary>
        /// <example>await TcpConnect();</example>
        public async Task TcpConnect()
        {
            TcpClient client = null;
            NetworkStream stream = null;
            try
            {
                using (client = new TcpClient())
                {
                    await client.ConnectAsync(IPAddress.Parse(Address), Port); // 接続 (非同期)
                    Connecting = true; // 接続中フラグをセット
                    using (stream = client.GetStream())
                    {
                        while (Connecting)
                        {
                            var data = new byte[256];
                            var bytes = await stream.ReadAsync(data, 0, data.Length); // データ読み込み
                            if (!Connecting) break; // false がセットされていたら終了

                            var response = Encoding.ASCII.GetString(data, 0, bytes); // データの文字列化
                            // TODO 後続処理
                        }
                    }
                }
            }
            catch (Exception e)
            {
                // エラー処理
                Connecting = false;
                try { if (stream != null) stream.Close(); } catch { }
                try { if (client != null) client.Close(); } catch { }
            }
        }

Windows Forms

アプリケーション設定値を読み書きする

        private string setting1 = "";

        /// <summary>
        /// フォームが開かれる時
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            // 値の読み出し
            setting1 = Properties.Settings.Default.setting1;
        }
        /// <summary>
        /// フォームが閉じられる時
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // 値のセット
            Properties.Settings.Default.setting1 = setting1;
            // 値の保存
            Properties.Settings.Default.Save();
        }

OpenFileDialog でフォルダーを選択させる

            var initialPath = ""; // textBox1.Text など
            var selectedPath = ""; // 結果
            using (var dialog = new OpenFileDialog() { FileName = "フォルダーを選択", Filter = "フォルダー|.", CheckFileExists = false })
            {
                // 初期ディレクトリの設定
                if (initialPath != "" && Directory.Exists(initialPath))
                {
                    dialog.InitialDirectory = initialPath;
                }
                // 選択結果の取得
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    selectedPath = Path.GetDirectoryName(dialog.FileName);
                }
            }

ユーティリティメソッド

※ 拡張メソッドにしたい場合は第一引数に this キーワードを追加してください。

Dictionary の値の取得 (キーがなければ既定値)

        /// <summary>
        /// 指定したキーに関連付けられている値を取得します。キーが存在しない場合は、既定値を返します。
        /// </summary>
        /// <example>
        /// var dict = new Dictionary<string, int>() { { "key", 123 } };
        /// var v1 = GetOrDefault(dict, "key"); // 123
        /// var v2 = GetOrDefault(dict, "x"); // 0
        /// var v3 = GetOrDefault(dict, "x", 456); // 456
        /// </example>
        /// <typeparam name="TKey">キーの型</typeparam>
        /// <typeparam name="TValue">値の型</typeparam>
        /// <param name="dict">ディクショナリ</param>
        /// <param name="key">取得する値のキー</param>
        /// <param name="defaultValue">ディクショナリにキーが存在しない場合の既定値</param>
        /// <returns>指定したキーに関連付けられている値。キーが存在しない場合は、既定値</returns>
        public static TValue GetOrDefault<TKey, TValue>(Dictionary<TKey, TValue> dict, TKey key, TValue defaultValue = default(TValue))
        {
            return dict.ContainsKey(key) ? dict[key] : defaultValue;
        } 

重複で例外が起きない ToDictionary()

        /// <summary>
        /// 指定されたキーセレクター関数および要素セレクター関数に従ってIEnumerableからDictionaryを生成します。キーが重複した場合は例外を発生させず後ろにある要素が採用されます。
        /// </summary>
        /// <typeparam name="TSource">要素の型</typeparam>
        /// <typeparam name="TKey">によって返されるキーの種類</typeparam>
        /// <typeparam name="TElement">によって返される値の型</typeparam>
        /// <param name="e"></param>
        /// <param name="keySelector">各要素からキーを抽出する関数。</param>
        /// <param name="elementSelector">各要素から結果の要素値を生成する変換関数。</param>
        /// <returns>Dictionary</returns>
        public static Dictionary<TKey, TElement> ToSafeDictionary<TSource, TKey, TElement>(IEnumerable<TSource> e, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
        {
            return e.GroupBy(keySelector).ToDictionary(g => g.Key, g => elementSelector(g.Last()));
        }

文字列のパース (失敗した場合既定値)

int.TryParse() などがたくさん必要なときなどに使います。

        /// <summary>
        /// 指定した文字列をT型に変換します。
        /// </summary>
        /// <example>
        /// var v1 = ParseOrDefault<int>("123"); // 123
        /// var v2 = ParseOrDefault<int>("abc"); // 0
        /// var v3 = ParseOrDefault<int>("abc", 999); // 999
        /// var v4 = ParseOrDefault<int?>("abc"); // null
        /// var v5 = ParseOrDefault<System.Drawing.Color>("#000000"); // Colorオブジェクト
        /// </example>
        /// <typeparam name="T">変換後の型</typeparam>
        /// <param name="s">変換対象の文字列</param>
        /// <param name="defaultValue">変換に失敗した場合の既定値</param>
        /// <returns>変換された値。変換に失敗した場合は既定値。</returns>
        public static T ParseOrDefault<T>(string s, T defaultValue = default(T))
        {
            try
            {
                var c = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
                if (c == null) return defaultValue;
                return (T) c.ConvertFromString(s);
            }
            catch (Exception)
            {
                return defaultValue;
            }
        }

ファイルの読み込み

        /// <summary>
        /// 読み取り専用の FileStream を生成します。(Excelなどで開かれているファイルを例外を発生させずにオープンできるようにします)
        /// </summary>
        /// <param name="path">ファイルのパス</param>
        /// <returns>読み取り専用の FileStream</returns>
        public static FileStream NewReadOnlyFileStream(string path)
        {
            return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        }

        /// <summary>
        /// テキストファイルデータを全て文字列として取得します。(File.ReadAllText()に近いメソッドです)
        /// </summary>
        /// <param name="path">テキストファイルのパス</param>
        /// <param name="encoding">エンコーディング (未指定の場合はデフォルトのエンコーディング)</param>
        /// <returns>ファイル内容</returns>
        public static string ReadAllText(string path, Encoding encoding = null)
        {
            if (encoding == null)
            {
                // encoding = Encoding.GetEncoding(TextFileEncoding); // 定数などでデフォルトエンコーディングを与える場合
            }

            using (var stream = NewReadOnlyFileStream(path))
            using (var reader = new StreamReader(stream, encoding))
            {
                return reader.ReadToEnd();
            }
        }