Pages

2014/10/31

[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"]);
}
Related Posts Plugin for WordPress, Blogger...