34
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LINQについての備忘録

Last updated at Posted at 2017-10-27

未だにLINQを使いこなせていなかったので、
忘れる前に備忘録。

特に有用そうなものをピックアップ。
  

ラムダ式の引数は
foreach(var item in DataList)
でいうところのitemを指す。
→これに気付くまでなかなか
 LINQ内でのラムダ式が理解できませんでした…  
  

LINQ用List
// 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あたりは
使えそうですね。

  
また最近気づいた便利なメソッド。
フォーム内のコントロールにまとめて処理したい時に使いました。

⑧Button型を抽出
var btns = this.Controls.Oftype<Button>();
foreach (var btn in btns)
{
    btn.Enabled = false;
}
⑨ジェネリックにCastして、ControlsへLinqを使えるようにする
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メソッド

34
31
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?