我目前正在尝试教我自己如何使用lambda表达式(非常喜欢它们的外观)
在我的win表单上,我有2个用于浏览目录的按钮,然后将用户选择的目录放在相应的文本框中。这是我到目前为止所做的。
在setDirectory事件中有什么方法可以按钮检查内联?我真的想要清理setDirectory事件中的代码。
private void setDirectory_Click(object sender, EventArgs e)
{
Button dirButton = sender as Button;
TextBox dirTextBox;
if (dirButton.Name == fromDirButton.Name)
dirTextBox = fromTextBox;
else
dirTextBox = toTextBox;
Func<string> setDirectory = SetDirectory();
fromTextBox.Invoke((MethodInvoker)(() => { dirTextBox.Text = setDirectory(); }));
}
private static Func<string> SetDirectory()
{
using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
{
folderBrowserDialog.Description = "Select Path";
folderBrowserDialog.RootFolder = Environment.SpecialFolder.MyComputer;
folderBrowserDialog.ShowDialog();
return () => folderBrowserDialog.SelectedPath != "" ? folderBrowserDialog.SelectedPath : "";
}
}
答案 0 :(得分:2)
希望尽可能将更多代码内联
为什么呢?这看起来不像Lambda Expressions的正确使用。
你的问题应该是:
何时使用Lambda表达式,何时不使用?
Lambda表达式不能取代传统的编码,例如对话框等。它们提供了一种以更实用的方式表达正在做的事情的方式。
var net30PastDueInvoices =
invoiceRepository.GetInvoicesFor(currentClient)
.Where(f => 30 < DateTime.Today.AddDays(-f.InvoiceDate));
甚至可以处理迭代:
var items = repository.GetList().ForEach(i => {
// Process items here.
// Notice that the code processed here is located in a foreach loop
// especially for the given purpose within an anonymous method.
// Should you need to perform this operation over and over again,
// you should extract this to a proper method and describe what it
// does in its name.
});
您非常不鼓励尝试使用Lambda表达式,因为它只会增加代码复杂性。
简而言之, Lambda Expression 以实用的方式表达业务规则等非常实用。除此之外,Keep It Simple, Stupid (KISS)!
<强> 声明 强>
我不是说你在这里傻了。点击链接了解更多信息。
答案 1 :(得分:1)
对于Lambda来说,你的使用并不是真正理想的,Lambda在 Linq&amp; amp;&amp;泛型使其非常易于使用。一个例子:
List<string> collection = new List<string>();
if(!collection.Any())
// Collection isn't null.
var quantity = collection.Count(c => c > 5);
正如您所看到的,Lambda管道数据是有意义的。它变得富有表现力,而不是模糊不清。
您可以使用Lambda的区域可能会更好地使用更传统的实现。仅仅因为它变得越来越复杂,表达力度也越来越差。这使代码难以维护和重构,简单通常是最好的方法。
我建议尝试在适当的环境中学习Lambda,而不是为了使用它们。