R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

2008年10月3日

なるべく流れ制御を回避する

題名のようなテーマで以前エントリーをあげました。
確か、以下だったと思います。

http://blogs.wankuma.com/rti/archive/2008/09/29/157748.aspx
風邪をこじらせたようだ

熱に浮かされながら、つらつらと書いただけあって、言いたいことを深く考えもせずに語っております。

で、この話題をどうやって終わらせようか?、などと書いたことを後悔しつつも、このままというのも気持が悪いので何とかまとめていこうと思います。

以下のコードは、処理の流れを利用することで目的となる回答を得ています。


private bool Search(string[] array, string target) {
  foreach(var x in array) {
    if (x == target) return true;
  }
  return false;
}


これは LINQ を使うことで以下のように、自ら

流れ制御文を記述することなく

同じ結果を得ることができます。


private bool Search2(string[] array, string target) {
  return array.Where(x => x == target).Select(x => true).FirstOrDefault();
}


また、LINQ を使わなくても、流れ制御部分と本来の目的の部分を分離することによって、自らが流れ制御文を書く機会を減らすこともできます。
上記の処理は、以下の 2 つの処理に分離できます。


(1) 全要素分だけ反復したら false を返し、中断指示を受けたら true を返す処理

private bool LoopUntil<T>(IEnumerable<T> source, Func<T, bool> until) {
  foreach(var x in source) {
    if (until(x)) return true;
  }
  return false;
}


(2) 文字列配列中の要素に、特定の文字列が存在するかどうかを判定する処理

private bool Search3(string[] array, string target) {
  return this.LoopUntil<string>(array, x => x == target);
}


このように流れ制御文をカプセル化するのも、僕としてはアリかなー、と思っています。

posted @ 13:36 | Feedback (6)