[C#] ラムダ式での IN 句

ラムダ式で SQL の WHERE IN のようなことをするためには、検索の元となる値を配列にしてしまい、Contains を使用する。
そもそもデータを取得する時点で絞り込んでおくべきではあるが、こんな書き方もできるというメモ。
// 今さら DataTable ではあるが、使用されているケースは多い…はず?
var dt = new DataTable();
dt.Columns.Add("Class", typeof(int));
dt.Columns.Add("Name", typeof(string));
for (var i = 0; i <= 10; i++)
{   
    var dr = dt.NewRow();
    dr["Class"] = i;
    dr["Name"] = "Hoge " + i.ToString() + " 世";
    dt.Rows.Add(dr);
}
for (var i = 11; i <= 20; i++)
{
    var dr = dt.NewRow();
    dr["Class"] = i;
    dr["Name"] = "Gege " + i.ToString() + " 世";
    dt.Rows.Add(dr);
}
// 設定ファイルなどに記載された CSV を仮定。Class が 1 もしくは 3 であるレコードを取得する。
var settings = "1,3";
// string[] に分割後、List に変換。数値型にする。
var list = settings.Split(',').ToList().ConvertAll(x => int.Parse(x));
var ret = dt.AsEnumerable().Where(x => list.Contains((int)x["Class"]));
foreach(var x in ret)
{
    // 出力
    // Hoge 1 世
    // Hoge 3 世
    Console.WriteLine(x["Name"]);
}

このブログの人気の投稿

コピーした行の挿入が表示されない時はフィルタされていないかチェック

Excel で一部の図形だけ固定する