首先,我无法理解.NET 3.5的功能/ Lambda方面。我每天都在LINQ中使用这些特性,但我的问题是理解实现,以及它们的真正含义(Lambda?System.Func?(等)
考虑到这一点,如何实现以下目标:
例如,我希望有一个List(Of T)的扩展方法,它将列表中所有对象的属性设置为某个值,并返回更新后的列表( T)。它的名称如下:
VB:
Dim someList As List(Of TextBox) = (New List(Of TextBox)).UpdateExtension(Function(txtb) txtb.Text = "something")C#:
List<TextBox> someList = (new List<TextBox>()).UpdateExtension(txtb => txtb.Text = "something");,在VB和C#中,扩展方法会是什么样子?
即:
<Extension()> _
Public Function UpdateExtension(Of T)(ByVal source As List(Of T), ByVal predicate As ??) As List(Of T)
'??
End Function干杯!
编辑
正如许多人指出的那样,可以或多或少地使用.ForEach()来实现上述目标。但我感兴趣的是如何实现类似.ForEach()之类的东西,也就是说,我对解决上述问题的解决方案的实现感兴趣。
发布于 2009-05-05 03:27:15
实际上,这里是混合和匹配扩展方法。它几乎是Select的组合。您似乎需要一个方法,该方法允许您同时修改列表的元素并返回原始枚举。下面这个应该对你有好处。
VB.Net
<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 FunctionC#
public static IEnumerable<T> UpdateExtension<T>(this IEnumerable<T> source, Action<T> del) {
foreach ( var cur in source ) {
del(cur);
}
return source;
}发布于 2009-05-05 03:20:32
除了修改列表而不是返回新的列表之外,这只是一个.ForEach()调用。
要真正理解这是如何工作的,考虑更多的是IEnumerable而不是列表。想一想为什么下面这两个表达式有相同的结果,为什么后者通常更可取:
MyEnumerable.Count() > 2
MyEnumerable.Skip(2).Any()为了帮助完成这一任务,使用C#的IEnumerable关键字重新实现一些标准的yield扩展。一旦你真正理解了为什么第二个表现更好,你就应该保持良好的状态。
至于不同的基本委托类型,您只需要学习它们。假设Func是您的基本公共委托,其中为泛型类型参数指定参数类型和返回类型。然后,将Action看作返回类型为void的Func的特例,将Predicate看作返回类型为bool的特例。
发布于 2009-05-05 03:36:02
扩展是通过静态方法在静态类中实现的,这些方法将扩展的目标作为前面的this关键字的第一个参数。为了实现您的示例,我将这样做:
public static class ListBoxExtensions
{
public static List<TextBox> SetToValue(this List<TextBox> txtBoxes, string sValue)
{
txtBoxes.ForEach(txtBox => txtBox.Text = sValue);
return txtBoxes;
}
}并在Windows窗体上使用这三个文本框:
private void Form1_Load(object sender, EventArgs e)
{
List<TextBox> boxes = new List<TextBox>
{
textBox1,
textBox2,
textBox3
}.SetToValue("Hello");
}抱歉-别说VB。
希望这能有所帮助。
https://stackoverflow.com/questions/823157
复制相似问题