首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VB和C#中用Action / Func / Delegates / Lambda编写扩展方法

在VB和C#中用Action / Func / Delegates / Lambda编写扩展方法
EN

Stack Overflow用户
提问于 2009-05-05 03:15:42
回答 3查看 6.4K关注 0票数 3

首先,我无法理解.NET 3.5的功能/ Lambda方面。我每天都在LINQ中使用这些特性,但我的问题是理解实现,以及它们的真正含义(Lambda?System.Func?(等)

考虑到这一点,如何实现以下目标:

例如,我希望有一个List(Of T)的扩展方法,它将列表中所有对象的属性设置为某个值,并返回更新后的列表( T)。它的名称如下:

VB:

代码语言:javascript
复制
 Dim someList As List(Of TextBox) =  (New List(Of TextBox)).UpdateExtension(Function(txtb) txtb.Text = "something")

C#:

代码语言:javascript
复制
List<TextBox> someList = (new List<TextBox>()).UpdateExtension(txtb => txtb.Text = "something");

,在VB和C#中,扩展方法会是什么样子?

即:

代码语言:javascript
复制
 <Extension()> _
 Public Function UpdateExtension(Of T)(ByVal source As List(Of T), ByVal predicate As ??) As List(Of T)
        '??
 End Function

干杯!

编辑

正如许多人指出的那样,可以或多或少地使用.ForEach()来实现上述目标。但我感兴趣的是如何实现类似.ForEach()之类的东西,也就是说,我对解决上述问题的解决方案的实现感兴趣。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-05 03:27:15

实际上,这里是混合和匹配扩展方法。它几乎是Select的组合。您似乎需要一个方法,该方法允许您同时修改列表的元素并返回原始枚举。下面这个应该对你有好处。

VB.Net

代码语言:javascript
复制
<Extension()> _
Public Function UpdateExtension(Of T)(ByVal source As IEnumerable(Of T), ByVal del As Action(Of T)) As IEnumerable(Of T)
  For Each cur in source
    del(cur)
  Next
  Return source
End Function

C#

代码语言:javascript
复制
public static IEnumerable<T> UpdateExtension<T>(this IEnumerable<T> source, Action<T> del) {
  foreach ( var cur in source ) {
    del(cur);
  }
  return source;
}
票数 2
EN

Stack Overflow用户

发布于 2009-05-05 03:20:32

除了修改列表而不是返回新的列表之外,这只是一个.ForEach()调用。

要真正理解这是如何工作的,考虑更多的是IEnumerable而不是列表。想一想为什么下面这两个表达式有相同的结果,为什么后者通常更可取:

代码语言:javascript
复制
MyEnumerable.Count() > 2
MyEnumerable.Skip(2).Any()

为了帮助完成这一任务,使用C#的IEnumerable关键字重新实现一些标准的yield扩展。一旦你真正理解了为什么第二个表现更好,你就应该保持良好的状态。

至于不同的基本委托类型,您只需要学习它们。假设Func是您的基本公共委托,其中为泛型类型参数指定参数类型和返回类型。然后,将Action看作返回类型为void的Func的特例,将Predicate看作返回类型为bool的特例。

票数 2
EN

Stack Overflow用户

发布于 2009-05-05 03:36:02

扩展是通过静态方法在静态类中实现的,这些方法将扩展的目标作为前面的this关键字的第一个参数。为了实现您的示例,我将这样做:

代码语言:javascript
复制
public static class ListBoxExtensions
{
  public static List<TextBox> SetToValue(this List<TextBox> txtBoxes, string sValue)
  {
    txtBoxes.ForEach(txtBox => txtBox.Text = sValue);
    return txtBoxes;
  }
}

并在Windows窗体上使用这三个文本框:

代码语言:javascript
复制
private void Form1_Load(object sender, EventArgs e)
{
  List<TextBox> boxes = new List<TextBox>
                        {
                          textBox1,
                          textBox2,
                          textBox3
                        }.SetToValue("Hello");
}

抱歉-别说VB。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/823157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档