[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 で入力した文字に勝手に取り消し線が入る

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