2009-05-24 5 views
4

ラムダ式をテストする小さなテストアプリケーションを構築しました。私はここや他のところでいくつかの例を見つけましたが、私はそれらを手に入れません。動的ビルドラムダ式

テキストボックスやその他の変数を使用して式を作成する方法を説明できる人はいますか?

私のテストリスト

List<People> lPeople = new List<People> 
{ 
    new People { Name= "Jean", LastName = "Borrow", Age= 21 } , 
    new People { Name= "Dean", LastName = "Torrow", Age= 20 } 
}; 

の作業ラムダ式

IEnumerable<People> result = lPeople.Where(p => p.Age < 21); 
dgv_1.DataSource = result.ToList(); 
dgv_1.Update(); 

は、どのように私は動的に式を作成することができますか? (もちろん動作しません)lPeople.Where(p => p.LastName == Textbox.Text);

おかげのような

何か!

編集:あなたがそれをしようとするとどうなり

を「もちろん動作しません」

Int32 iAge; 
Boolean bSuc = Int32.TryParse(tb_filter_age.Text, out iAge); 
if (!bSuc) 
{ 
    iAge = 0; 
} 
+0

テキストボックスコントロールの名前を誤って入力した可能性があります。それはTextBox1ですか? :) – shahkalpesh

答えて

5

以下の溶液にいくつかのコードを追加しましたか?それを見れば、それは私がずっとやっていることです。

演算子を指定するコンボボックスに基づいて操作を切り替えるには:ユーザーが変換できない何かを入力した場合intに年齢の文字列を変換し

int age = int.Parse(textBoxAge.Text); 

IEnumerable<People> result; 
if (comboBoxOperator.Text == "=") 
    result = lPeople.Where(p => p.Age == age); 
else if (comboBoxOperator.Text == "<") 
    result = lPeople.Where(p => p.Age < age); 
else 
    result = lPeople.Where(p => p.Age > age); 

dgv_1.DataSource = result.ToList(); 
dgv_1.Update(); 

コードがスローされます。例外を回避するにはTryParseを参照してください。

+0

おっと、すみません!それは動作します:)しかし、オペラントについてはどうですか? –

+0

OK ...ダイアログコントロールの状態に基づいて演算子(==、<, >、!=など)を選択することを意味しますか?あなたが達成しようとしていることを本当に慎重に説明すれば、これはもっと早くなります! –

+0

こんにちはEarwicker、はい、私はそれを望みます。私はユーザーがLastNameとAgeで人のリストをフィルタリングすることを選択できるUIを持っています。私はリストボックスを選択することができます>、=と<と彼らは年齢を入力することができますテキストボックス。 –

2

あなたのサンプルラムダ式が動作します。どのように動的にする必要がありますか?あなたは、コレクションに適用する「フィルタ」の静的なUIを持っている場合は、次のようなコードを作成することができます。

IEnumerable<People> result = lPeople; 
if (txtLastName.Text.Trim().Length != 0) 
    result = result.Where(p => p.LastName == txtLastName.Text); 
if (chkSeniors.Checked) 
    result = result.Where(p => p.Age >= 65); 
dgv_1.DataSource = result.ToList(); 
dgv_1.Update(); 

あなたは、データ・ソースの消費者は(それら余裕が真に動的な式を適用する場合フィルタリングする他のフィールドと使用する式を選択する機能)は、述語ビルダーツールまたはLINQ式オブジェクトを使用して実装するより複雑な機能です。

+0

実際には演算子も変更したいと考えています。 –

2

あなたのやり方に間違いはないはずです。私は、TextBoxButton、およびDataGridView(名前はそれぞれtextBox1,button1、およびdgv_1)という簡単なWindowsフォームアプリケーションを作成しました。ここでは)

は私が期待通りに働いていたForm1.csファイルに使用するコードです:ダイナミック、ユーザーの選択の場合は

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     List<People> lPeople = new List<People> 
     { 
      new People { Name= "Jean", LastName = "Borrow", Age= 21 } , 
      new People { Name= "Dean", LastName = "Torrow", Age= 20 } 
     }; 

     IEnumerable<People> result = lPeople.Where(p => p.Name == textBox1.Text); 

     dgv_1.DataSource = result.ToList(); 
     dgv_1.Update(); 
    } 
}  

public class People 
{ 
    public string Name { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
} 
+0

こんにちはJohn、まさに私がやったこと:) –

1

、私はブロックが可能かどう宣言するために使用したというし、よりエレガントなソリューションだと思います変数

Func<People, bool> expFilter; 

は、ユーザーの選択に基づいて、その値を設定し

switch(comboBoxOperator.Text) 
{ 
    case "=": 
    expFilter = p => p.Age == age; 
    break; 

    case ">": 
    expFilter = p => p.Age > age; 
    break; 

    case "<": 
    expFilter = p => p.Age < age; 
    break; 
}  

を入力し、Where句に渡します。

result = lPeople.Where(expFilter);