4

投稿日

更新日

C# でコードをシンプルに書く定石

はじめに

同じ処理でも書き方次第でシンプルに書けます。
1つずつのTIPSの中は、極力、バージョンに依存する書き方は避けて書くようにしています。
但し、TIPそのものが.NET のバージョンによっては書けないものもありますでご了承ください。

if 条件の処理をシンプルに書く

条件に応じて true / false を設定する

→「条件そのものを変数に設定する」

int a = 8;
// aが1~10ならばtrue。それ以外はfalse
bool b = (a >= 0 && a <= 10);

null だったら空文字にする

→「フォーマット出力する」

object? o = null;
// フォーマット出力
string s = string.Format("{0}", o);
// この書き方ができるバージョンからはこっちの方がシンプル
// string s = $"{o}";

一定値以下だったら一定値にする

「値が0より小さい場合は0にする」「現在値より計算値の方が大きい場合は計算値を採用する」など。
→「値と条件値の大きい方(小さい方)」を採用する」

int a = -5;
// マイナスだったら0にする
a = Math.Min(a, 0);

指定文字数以上だったら指定文字数まで、それ未満なら指定文字数になるまで末尾を空白で埋める

→「条件値の末尾に指定文字数分の空白をくっつけて指定桁数でぶった切る」

string s = "abcd";
// 10文字以上だったら10文字まで、10文字未満なら10文字になるように末尾を空白で埋める
s = (s + new String(' ', 10)).Substring(0, 10);

条件に一致した場合に2つ目以降の値の前に特定値を付与して連結する

「2つ目以降の条件の場合はandを前につける」「文字列をカンマで連結する」など
→「リストに値を入れてセパレータを指定して結合する」

var ss = new List<string>();
string s1 = "abc.txt";
if (!string.IsNullOrEmpty(s1))
{
    ss.Add(s1);
}
string s2 = "def.txt";
if (!string.IsNullOrEmpty(s2))
{
    ss.Add(s2);
}
string s = string.Join(", ", ss);
  • where 条件で and を付ける/付けないの処理については、最初の条件を「1 = 1」にして、以降の条件には必ず「and」を付けるという手もあります。
  • セパレータの値をわざわざ定数にする必要もないので、極力、セパレータの記載が少ない書き方にしました。

イマドキのか生き方

null だったらデフォルト値を設定する

object? o = null;
string s = o?.ToString() ?? "";

int? i = null;
i = i ?? 0;
  • o? の部分は、o が null だった場合に後続のメソッドは処理されずにnullを返します。
  • ?? の部分は 前部分が null だった場合の 後部分を返します。
  • 空文字変換以外にも使えるので応用範囲は高いです。

WHERE や IN の条件判定式

string s = "a";
if (s is "a" or "b")
{
    // s が "a" もしくは "b" の場合
}

int i = 3;
if (i is >= 1 and <= 10)
{
    // i が 1 以上 10 以下 の場合
}

おわりに

「この書き方は、このバージョンからできるよ」「このバージョン以降ならもっとシンプルに書ける」「他にこんなもある」とかあれば、ぜひコメントください。

追記:
一つずつへのお礼コメントは省略させていただいていますが、コメントくださった皆様ありがとうございます。本文にもフィードバックさせていただきます。

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
4