たこぜりー研究室

大腸菌DNAは4.64Mbp。酵母は13Mbpで、ヒトは3Gbp

スポンサーサイト

#
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

LINQ 探索 #3

#448
実用性・美しさ云々はスルーして、例えばこんなコード。
遺伝子ごとの系統樹から、それぞれの種の枝の長さを出力するイメージ。

using System;
using System.Collections.Generic;
using System.IO;

public static void WriteMatrix<TColumn, TRow>(
  this TextWriter writer,
  IEnumerable<TColumn> columns, IEnumerable<TRow> rows,
  Func<TRow, IEnumerable<string>> cells) {...}

static void Main()
{
  Dictionary<string, Dictionary<string, double>> data = (略)

  using (StreamWriter writer
    = File.CreateText("branch length.txt"))
  {
    writer.WriteMatrix(species, genes, gene =>
    {
      foreach (double branchLength in data[gene].Values)
        yield return branchLength.ToString();
    }
  }
}

元はデリゲート部分が Func<TColumn, TRow, string> だったのですが、行単位でまとめて出力する必要であって、string を IEnumerable<string> 化。
Select と SelectMany の感覚で。

だがコンパイルエラー。何かと思えば、

yield ステートメントは、匿名メソッドまたはラムダ式の内部では使用できません

(゜д゜)

そういえばそうだったような・・・、あははh _| ̄|○
言語仕様をよく読まんからいかんのだ。

そこでクエリ式だと思いつき、

writer.WriteMatrix(species, genes, gene =>
{
  return from branchLength in data[gene].Values
      select branchLength.ToString();
}

で終了。あぁ微妙。

コメント


コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURL:  http://takojelly.blog2.fc2.com/tb.php/448-0347290e
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。