2015年1月1日木曜日

LINQを学習してみる

LINQ to Objectsとは
"LINQ to Objects" という用語は、LINQ to SQL [LINQ to SQL] や LINQ to XML などの中間 LINQ プロバイダーまたは API を使用せずに、LINQ クエリを任意の IEnumerable コレクションまたは IEnumerable コレクションと直接組み合わせて使用することを意味します。
http://msdn.microsoft.com/ja-jp/library/bb397919.aspx

IEnumerableを継承していれば使えるということで
例えばstring型なんかも継承しているので使うことができます。

たとえば、下記文字列にoが何個含まれているか調べるとすると
gooooooooooooooooooooooooooogle


using System;
using System.Linq;
using System.Collections;

namespace SampleCode {
    class Program {
        static void Main(string[] args) {

            string test = "gooooooooooooooooooooooooooogle";
            //Inumerableが継承されているか確認する
            Console.WriteLine("Inumerable実装されて{0}", (test is IEnumerable) ? "いる" : "いない");

            //LINQで oの個数を調べる
            int count = test.Count(c => c == 'o'); //ラムダ式を渡す
            Console.WriteLine("oの数は{0}個です", count.ToString());
        } 
    }

}

とても便利ですね。
string型の場合一文字ずつ渡されるのでそれをcという変数で受け取り
カウントするさいの条件式を渡してあげているわけですね。
ラムダ式になじみがないとみづらいかもしれませんが
c => c == 'o' は、javascriptで言えばこれと一緒ですね
function(c){ return c == "o" }


LINQを使わないのであれば下記のようになりそうですね。
//LINQで oの個数を調べる
            int count = test.Count(c => c == 'o'); //ラムダ式を渡す
            Console.WriteLine("oの数は{0}個です", count.ToString());
            ↓
            //LINQで oの個数を調べる
            int count = 0;
            for (int i = 0; i < test.Length; i++) {
                count += (test.Substring(i, 1) == "o") ? 1 : 0;
            }

            Console.WriteLine("oの数は{0}個です", count.ToString());

LINQなら、明示的に1文字ずつ取り出す処理を書かなくてもやってくれるあたりがらくちんなんでしょうね。
と、いうことで使い方がすぐになれないLINQなので少しずつ勉強して使い方を覚えていく予定。

0 件のコメント:

コメントを投稿