第一次使用lambda。希望在可能的情况下将更多代码内联

时间:2014-08-15 14:23:58

标签: c# winforms lambda

我目前正在尝试教我自己如何使用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 : "";
           }
        }

2 个答案:

答案 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,而不是为了使用它们。