未だにLINQを使いこなせていなかったので、
忘れる前に備忘録。
特に有用そうなものをピックアップ。
ラムダ式の引数は
foreach(var item in DataList)
でいうところのitemを指す。
→これに気付くまでなかなか
LINQ内でのラムダ式が理解できませんでした…
// Dataクラスはid, name, pointプロパティを持つとする。
var DataList = new List<Data>();
var records = DataList.Where(data => data.point == "10");
①whereではData[]の配列 IEnumerable型で返ってくるので
必要に応じてListへ変換する。
→ToList()について、コメントをいくつかいただいたので削除しました。
TPOに応じて、ToArray()などの使い分けが必要のようですね。
無意味なToList()はリソースの無駄遣いとなるようです。
.ToList()すると、Listの実体が作られるため、処理コストがかかる&あとでガベージになります。
もしListとして扱う必要がないのなら(ただ一覧として持っておきたいだけ、すぐにforeachするだけ)なのであれば、あえて.ToList()しないほうがいい場合もありそうですね。
もちろん、最終結果をListとして保持しておく必要がある場合は、.ToList()は必要です
var record = DataList.FirstOrDefault(data => data.id == "1");
//②と同様の結果が得られる(LINQではなくListのメソッド)
var record = DataList.Find(data => data.id =="1");
②**.First:**一致するデータがないとExceptionが発生するので注意。
**.FirstOrDefault, .Find:**参照型ならデフォルト値としてnullを返します。
個人的にはFindの方が可読性的に好みですね。
(ただし、パフォーマンスはFirstの方が上のようです。)
FirstOrDefault, .Findについてコメントをいただきました。
**.FirstOrDefault:**IEnumerableのメソッド
**.Find:**Listのメソッド
なので前者の方が統一的に使えるようです。
.FirstOrDefault vs .Find ですが
これ、宣言されている場所がそれぞれ違います。
FindはListが持っているメンバメソッドです。なのでList以外では"使えません"。
一方FirstOrDefaultはLINQというかIEnumerableに(拡張メソッドとして)実装されているのでどんなリストの型でも使えます
。
bool existsData = DataList.Any(data => data.id == "1");
int cnt = DataList.Count(data => data.point == "10");
var records = DataList.Select(data => data.id * data.id);
var records = DataList
.Select(data =>
new {
data.id
, data.name
});
var Datas = DataList
.Select((data, index)=>
index
, new
{
data.id
, data.name
});
その他ではExcel関数的な、
Sum, Average, Max, Minあたりは
使えそうですね。
また最近気づいた便利なメソッド。
フォーム内のコントロールにまとめて処理したい時に使いました。
var btns = this.Controls.Oftype<Button>();
foreach (var btn in btns)
{
btn.Enabled = false;
}
var btns = this.Controls.Cast<Control>();
.Select(ctrl => ctrl as Button)
これら2つのメソッドは
ジェネリックなIEnumerable<T>
型でなくても使えるので、
Controls(Control[]型)に直接使えます。
**OfType:**isで判定。型変換できたものだけを抽出する。
Cast:()で判定。キャスト失敗するとInvalidCastException投げる。
まだまだ未熟者ですので、
記述に間違い等あればご指摘よろしくお願いいたします。
こちらもご覧ください
LINQでのJOINについての備忘録
参考:
そのforeach本当に要りますか?~for/foreach等をLINQに書き換える~ - Qiita
OfTypeメソッドとCastメソッド