VB 및 C#의 액션 / func / 델리게이트 / 람다로 확장 방법 작성
-
05-07-2019 - |
문제
먼저 .NET 3.5의 기능적 / 람다 측면을 둘러 볼 수 없습니다. 나는 LINQ에서 매일 이러한 기능을 사용하지만 내 문제는 구현을 이해하는 것입니다.
이를 염두에두고 다음은 어떻게 달성됩니까?
예를 들어, 목록의 모든 객체의 속성을 특정 값으로 설정하고 업데이트 된 목록 (t)을 반환하는리스트 (t)에 대한 확장 메소드를 원합니다. 다음과 같이 불립니다.
VB :
Dim someList As List(Of TextBox) = (New List(Of TextBox)).UpdateExtension(Function(txtb) txtb.Text = "something")
씨#:
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 ()와 같은 것이 어떻게 구현되는지를 이해하는 데 있습니다. 즉, 위의 문제에 대한 솔루션 구현에 관심이 있습니다.
해결책
정말 당신은 여기서 미키고 일치하는 확장 방법입니다. Select와 Foreach의 거의 조합입니다. 목록의 요소를 수정하고 원래 열거를 반환 할 수있는 메소드를 원하는 것으로 보입니다. 다음은 당신을 위해 트릭을 수행해야합니다.
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 Function
씨#
public static IEnumerable<T> UpdateExtension<T>(this IEnumerable<T> source, Action<T> del) {
foreach ( var cur in source ) {
del(cur);
}
return source;
}
다른 팁
새로운 목록을 반환하기보다는 목록을 수정한다는 점을 제외하고, 이것은 단지 .ForEach()
전화.
이것이 어떻게 작동하는지 이해하려면 IEnumerable
목록보다 s. 아래 두 표현이 동일한 결과를 얻은 이유를 생각해보십시오. 그리고 후자가 일반적으로 바람직한 이유 :
MyEnumerable.Count() > 2
MyEnumerable.Skip(2).Any()
이를 달성하는 데 도움이 되려면 C#의 표준 Ienumerable 확장을 다시 구현하십시오. yield
예어. 두 번째가 더 잘 수행되는 이유를 실제로 알게되면 좋은 모양이 있어야합니다.
다른 기본 대의원 유형은 배워야합니다. 에 대해 생각하다 Func
기본 공통 대표로서 일반 유형 매개 변수의 인수 유형 및 리턴 유형을 지정합니다. 그런 다음 생각하십시오 Action
특별한 경우 Func
반환 유형이 무효 인 경우 Predicate
반환 유형이 bool 인 특별한 경우.
확장자는이 키워드가 앞에있는 첫 번째 매개 변수가 확장자의 대상을 취하는 정적 메소드에 의해 정적 클래스에서 구현됩니다. 예제를 구현하려면 다음을 수행합니다.
public static class ListBoxExtensions
{
public static List<TextBox> SetToValue(this List<TextBox> txtBoxes, string sValue)
{
txtBoxes.ForEach(txtBox => txtBox.Text = sValue);
return txtBoxes;
}
}
그리고 3 개의 텍스트 상자가있는 Windows 양식에서 이것을 사용하려면 다음과 같습니다.
private void Form1_Load(object sender, EventArgs e)
{
List<TextBox> boxes = new List<TextBox>
{
textBox1,
textBox2,
textBox3
}.SetToValue("Hello");
}
죄송합니다 - VB를 말하지 마십시오.
도움이 되었기를 바랍니다.