インドカレーファンクラブ

パソコン、カメラ

【C#】忘れがちコード

null結合演算子

nullではない最初のものを返す

string s1 = null;
string s2 = null;
string s3 = "hoge";
(s1 ?? s2 ?? s3).Dump(); // hoge

null条件演算子( ?. or ?[] )

メンバやインデックスのアクセスの前にそれがnullかどうかテストしてnullじゃなかったらアクセスする
メンバやインデックスがnullだったらnullを返す

class Person { public string name; }
void Main() {
    Person p = new person();
    person?.name.Dump(); // null
    person.name = "aaa"
    person?.name.Dump(); // aaa
    peerson.name = null;
    person?.name.Dump(); // null
}

大文字小文字を区別しない文字列比較

Equalsの第2引数にStringComparison.OrdinalIgnoreCaseを使う

メソッドをラムダ式

bool Exist() {
    return _value.HasValue;
}

bool Exist() => _value.HasValue;

getterでも同じことができる

nullableなintをSortしてnullを最後に

var list = new List<int?>() {
    1, 11, 12, 1, 5, -4, null, 4, null
};

var orderdList = list
    .OrderBy(x => !x.HasValue) //nullとnot nullでまず分ける。否定にすることでnullは後ろに回る
    .ThenBy(x => x) // 普通に昇順に並べる。最初に弾いておいたnullはそのままにそれ以外を昇順にするイメージ
    .ToList(); // 評価確定しなくてもいいよ
orderdList.Dump();

めも

new List<int?>(){1, -1, 0, null}.OrderBy(x => x.HasValue).Dump();
// null, 1, -1, 0

二次元Listを一次元リストに展開

つまりList<List>をListに展開 →SelectMany

Listがnullではなくて更に要素を持っていることの判定

Listつくる時点で初期化してればnullチェックなんて要らないじゃん!とも思うんだけど、
nullチェックはやっぱりしたくなる

List<string> list = null;

// よくある書き方
bool hasAnyItem1 = list != null && list.Any();
// こっちのほうが短い
bool hasAnyItem2 = list?.Any() ?? false;

// こっちでもいいけど個人的にはAnyを使いたい
bool hasAnyItem3 = list?.Count() > 0;
// 内部でこういう動き
(null > 0).Dump(); // false