C# のスニペット集

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

目次

注意

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

スニペット

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 { }
            }
        }

ユーティリティメソッド

※ 拡張メソッドにしたい場合は第一引数に 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();
            }
        }