2015年05月31日

LINQ to Objectサンプル(07): 条件に一致する最初の要素を取得する

   このエントリーをはてなブックマークに追加 Clip to Evernote
コレクションを走査し、条件に一致する最初の要素を取得する例です。
文字列の配列から、長さが4の文字列(最初に見つかった文字列)を取得しています。 条件に一致しなかった場合は、null を としています。

■ループを使ったコード
string[] words = "The quick brown fox jumps over a lazy dog".Split(' ');
string ans = null;
foreach (var w in words) {
    if (w.Length == 4) {
        ans = w;
        break;
    }
}
Console.WriteLine(ans);

■LINQを使ったコード
string[] words = "The quick brown fox jumps over a lazy dog".Split(' ');
var word = words.FirstOrDefault(x => x.Length == 4);
Console.WriteLine(word);

FirstOrDefault メソッドを使うことで、一発で、答えを求めることができます。
First()メソッドもありますが、First()メソッドの場合は、条件を満たす要素が見つからない場合は、 InvalidOperationException 例外が発生します。
FirstOrDefault()メソッドの場合は、default(T) の値(参照型はnull)が返ります。

引数を指定しなかった場合、コレクションの最初の要素が取得できます。

First, FirstOrDefault と対応する 最後の要素を取得する Last, LastOrDefault も存在します。

   

Posted by gushwell at 14:34Comments(0)TrackBack(0)

2015年05月27日

LINQ to Objectサンプル(06): 文字列を走査する

   このエントリーをはてなブックマークに追加 Clip to Evernote
文字列を走査する 文字列の中から条件に合う文字だけを使い処理をする例です。
ここでは、与えられた文字列から空白を取り除き、新たな文字列を組み立てています。

■ループを使ったコード
string s = "The quick brown fox jumps over a lazy dog.";
string t = "";
foreach (char c in s) {
    if (c != ' ')
        t += c;
}
Console.WriteLine(t);

結果は、 Thequickbrownfoxjumpsoveralazydog と表示されます。

■LINQを使ったコード
string s = "The quick brown fox jumps over a lazy dog.";
string t2 = new string(s.Where(c => c != ' ').ToArray());
Console.WriteLine(t2);

文字列は、IEnumerable<char>を実装しているので、LINQのメソッドが利用できます。
このコードでは、stringのコンストラクタに、文字配列を渡すことで、新たな文字列を生成しています。
なお、Where()メソッドで得られるのは、IEnumerable<char>なので、stringのコンストラクタに渡せるように、ToArray()メソッドで、配列に変換しています。

   
Posted by gushwell at 14:29Comments(2)TrackBack(0)

2015年05月24日

LINQ to Objectサンプル(05): 最小値、最大値を得る

   このエントリーをはてなブックマークに追加 Clip to Evernote
最小値、最大値を得る 配列やListなどに格納された値から最小値を求めるコードです。
ここでは、0より大きなの数値の中で、一番小さな値を求めています。

■ループを使ったコード
var list = new List<int> { 9, 7, -5, 4, 2, 5, 4, 0, -4, 8, -1, 0, 4 };
int min = int.MaxValue;
foreach (var n in list) {
    if (n > 0) {
        if (n < min)
            min = n;
    }
}
Console.WriteLine(min);

■LINQを使ったコード
var list = new List<int> { 9, 7, -5, 4, 2, 5, 4, 0, -4, 8, -1, 0, 4 };
int min = list.Where(n => n > 0).Min();
Console.WriteLine(min);

LINQでは、Minメソッドを使うだけです。もちろん最大値は、Maxメソッドです。

   
Posted by gushwell at 22:30Comments(0)TrackBack(0)

2015年05月20日

LINQ to Objectサンプル(04): 平均を求める

   このエントリーをはてなブックマークに追加 Clip to Evernote
平均を求める 配列やListに格納されている値の平均を求めるコードです。

■ループを使ったコード
var list = new List<int> { 9, 7, 5, 4, 2, 5, 4, 0, 4, 8, 1, 0, 4 };
int sum = 0;
foreach (var n in list) {
    sum += n;
}
double average = (double)sum / list.Count;
Console.WriteLine(average);

合計を求めてから、要素数で割っています。

■LINQを使ったコード
var list = new List<int> { 9, 7, 5, 4, 2, 5, 4, 0, 4, 8, 1, 0, 4 };
double average2 = list.Average();
Console.WriteLine(average2);

LINQでは、Averageメソッドを呼び出すだけです。
なお、Listの要素がクラスであっても、 double average2 = list.Average(obj => obj.Value); などと書くことができます。
もちろん、合計を求めるSumメソッドもあります。

var list = new List<int> { 9, 7, 5, 4, 2, 5, 4, 0, 4, 8, 1, 0, 4 };
double sum = list.Sum();
Console.WriteLine(sum);
  
Posted by gushwell at 22:30Comments(0)TrackBack(0)

2015年05月17日

LINQ to Objectサンプル(03): 全ての要素が条件を満たしているかを調べる

   このエントリーをはてなブックマークに追加 Clip to Evernote
全ての要素が条件を満たしているかを調べるコードです。
以下のコードでは、全てが正の数かどうかを調べています。

■ループを使ったコード
var list = new List<int> { 9, 7, 5, 4, 2, 5, 4, 0, 4, 8, 1, 0, 4 };
bool b = true;
foreach (var n in list) {
    if (n > 0)
        continue;
    b = false;
    break;
}
Console.WriteLine(b);


■LINQを使ったコード
var list = new List<int> { 9, 7, 5, 4, 2, 5, 4, 0, 4, 8, 1, 0, 4 };
bool b2 = list.All(n => n > 0);
Console.WriteLine(b2);

Allメソッドを利用しいてます。すべての要素で条件を満たしていれば、trueが返ります。
LINQを使ったコードのほうが直感的に書けますし、簡潔ですね。

   
Posted by gushwell at 22:00Comments(0)TrackBack(0)

2015年05月13日

LINQ to Objectサンプル(02): 条件に一致する要素があるかを調べる

   このエントリーをはてなブックマークに追加 Clip to Evernote
条件に一致する要素があるかを調べるコードです。

■ループを使ったコード
var list = new List<int> { 19, 17, 15, 24, 12, 25, 14, 20, 34, 28, 11, 30, 24 };
bool b = false;
foreach (var n in list) {
    if (n % 7 == 0) {
        b = true;
        break;
    }
}
Console.WriteLine(b);


■LINQを使ったコード。
var list = new List<int> { 19, 17, 15, 24, 12, 25, 14, 20, 34, 28, 11, 30, 24 };
bool b2 = list.Any(n => n % 7 == 0);
Console.WriteLine(b2);

Anyメソッドを使っています。どれか一つでも条件に一致する要素があれば、trueを返します。
もちろん、n % 7 == 0 の箇所は、C#の式ならば、メソッド呼び出しでも何でも書くことができます。
   
Posted by gushwell at 22:30Comments(0)TrackBack(0)

2015年05月10日

LINQ to Objectサンプル(01): 条件に一致する要素をカウントする

   このエントリーをはてなブックマークに追加 Clip to Evernote
これからしばらくの間、LINQ to Object の簡単なサンプルコードを掲載していきます。
「LINQ to Object使えば、もうfor や foreach ループはいらない」というのは言いすぎですが、
LINQ to Objectを使うと、ちょっとしたコードは、for文や foreach文を使う必要がありません。
しばらくは、伝統的なループ処理をLINQで書き直すとどうなるかを示していきます。

もう、LINQが世に出てから、かなりの年数が経ちますので、今更感もありますが、この春からC#を始めようという人も沢山いるわけですから、 そんな LINQ初心者の方々に向けて記事をアップしていこうと思います。

第一回目は、条件に一致する要素をカウントするコードです。

■ループを使ったコード
var list = new List<int> { 9, 7, 5, 4, 2, 5, 4, 0, 4, 8, 1, 0, 4 };
int count = 0;
foreach (var n in list)
    if (n == 0)
        count++;
Console.WriteLine(count);

■LINQを使ったコード
var list = new List<int> { 9, 7, 5, 4, 2, 5, 4, 0, 4, 8, 1, 0, 4 };
int count1 = list.Count(n => n == 0);
Console.WriteLine(count1);

Countメソッドを使っています。引数に、ラムダ式使って条件を指定するだけです。 配列に対しても同じコードが書けます。

var array = new int[] { 9, 7, 5, 4, 2, 5, 4, 0, 4, 8, 1, 0, 4 };
int count2 = array.Count(n => n == 0);
Console.WriteLine(count2);


  
Posted by gushwell at 21:30Comments(0)TrackBack(0)

2015年05月02日

どう書く?Orgに感謝を込めての目次

   このエントリーをはてなブックマークに追加 Clip to Evernote
「どう書く?Orgに感謝を込めて」シリーズの目次です。
こうやって一覧にすると随分とありますね。
もっといい解き方があるよという方はコメントいただけると嬉しいです。

どう書く?Orgに感謝を込めて (はじめに)
クリップボードへの転送
ファイルサイズの取得
環境変数の取得
ファイル更新の監視
データの圧縮と展開
設定ファイルから値を取得
XMLから情報を取り出す
ミリ秒まで含んだ時刻文字列を生成
自分自身のファイル名を知る方法
外部の実行ファイルを呼び出し
16進数から10進数の変換
ピラミッドを作る
横向きのピラミッドを作る
メソッドの一覧と呼び出し
実行時間の測定
ワーカスレッドを安全に終了させるまで待機
制限時間内のキー入力検査
世界時計
西暦から和暦変換
シードを固定した乱数を生成する
コマンドライン引数の取得
起動オプションの解析
リストを逆順に表示
配列のuniq
重複要素を取り除く
13日の金曜日を数え上げる
文字列のセンタリング
文字列型日時のN秒後時間取得
コード中の文字の頻度分析
九九の表示(桁合わせ)
指定された日の存在する週を求める
文字列に含まれる単語の最初の文字を大文字にする
隣り合う二項の差を求める
出力の一時停止と再開
並行処理
条件を満たす行を取り除く
タブ区切りデータの処理
標準入力と標準出力のリダイレクト
ビットのローテートシフト
逆転したビット列を求める
2進数の記述を容易に
バイナリークロック
キッチンタイマー
文字変換表に基く文字列の変換
コメントの削除
座標データの整列
倍数になる13進数を求める
n日後を返す関数を返す関数を定義する
Regexを使い文字列の一部を書き換える
与えられた数字のケタ数を調べる
「アルファベットの繰り上がり問題」を解く
指定コマンドを別プロセスで起動
指定されたフォルダ以下のファイルをゴミ箱へ
年間カレンダーを表示する
テキスト行の長さ合わせ
重複無し乱数を生成する
n個の数値を10個ずつ折り返して表示
自然数をm個の和で表す全パターンを求める
n人の中から公平にm人を選ぶ
文字列を指定した行数に均等分割する
UTF-16をUTF-8に変換
括弧の対応を保存したまま文字列を反転させる
数列が急勾配かどうかを判定する
10000以下のダブル完全数をすべて求める
漢数字で九九の表
整数の漢数字表記
長方形の交差判定
与えられた文字列でピラミッド
仲間はずれの判定
正整数のゲーデル数化
コラッツ・角谷の問題のステップ数(2^20まで)
数値リストの圧縮
立方根を求める(ニュートン法による近似解)
ケブンッリジ関数
リングノードベンチマーク< /a>
Dawkins' weasel プログラムを書く
総当たり戦の日程を作成する
あみだくじ
道順を数える
しりとりを続けるプログラムを書く
しりとりを続けるプログラムを書く の続き
島の数をカウントする
マップの通り抜け
水の移し替えパズルを解く
トランプの和と積のパズルを解く
手持ちのコインを減らす払い方を求める
割り算の筆算をシミュレート