【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が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