2009-05-24 103 views
4

於是,我開始建立一個小的測試應用程序來測試lambda表達式。我在這裏和其他地方發現了幾個例子,但我只是沒有得到它們。動態構建Lambda表達式

任何人都可以解釋我如何使用文本框或任何其他變量構建表達式?

我的測試列表

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

工作lambda表達式

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 2009-05-24 18:06:10

回答

5

的解決方案「這當然是不行的」

會發生什麼事,當你嘗試了嗎?從它的外觀來看,這就是我一直在做的事情。

要根據組合框指定的經營者進行切換操作:

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(); 

,年齡字符串轉換爲int如果用戶輸入的東西,不能轉換會拋出的代碼。查找TryParse以避免例外。

+0

Omg,我很抱歉!它確實工作:)但操作員呢? – 2009-05-24 18:07:57

+0

好的......你的意思是你想根據對話框控件的狀態選擇運算符(==,<, >,!=等)? (如果你真的很仔細地解釋你想要達到的目標,這會更快!) – 2009-05-24 18:32:43

+0

嗨Earwicker,是的,我希望那樣。我有一個用戶界面,用戶可以選擇按姓氏篩選人員列表,即按年齡篩選。我有一個ListBox,可以在其中選擇>,=和<以及一個可輸入年齡的文本框。 – 2009-05-24 18:55:11

2

你的榜樣lambda表達式會工作。你需要它是多麼動態?如果你有一個「過濾器」的靜態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 Expression對象實現的更復雜的功能。

2

應該有什麼不對,你要去了解它的方式。我創建了一個簡單的Windows窗體應用程序,其中包含TextBoxButtonDataGridView(分別命名爲textBox1,button1dgv_1。)

這裏是我用於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; } 
} 
1

在動態用戶選擇的情況下,我認爲一個更優雅的解決方案而不是使用if塊將申報可變

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);