문제

먼저 .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를 말하지 마십시오.

도움이 되었기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top