2016-10-04 6 views
2

그래서 내가 정확히 여기서 내가 한 일에 대해 누군가가 매우 철저하게 설명하는지 궁금 해서요. 나는 무엇과 함께 작업하는지, 그리고 코드의 의미는 무엇인지 알고 있습니다. 나는 그것을 설명 할 것이고, 나는 우둔 할 것이다.내 자신의 "LINQ"확장 메서드 만들기

public static IEnumerable<TSource> VisitorWhere<TSource>(this IEnumerable<TSource> enumerable, Predicate<TSource> CompareMethod) 
{ 
    ICollection<TSource> temp = new List<TSource>(); 

    foreach (TSource item in enumerable) 
    { 
     if(CompareMethod(item)) 
     { 
      temp.Add(item); 
     } 
    } 
    return temp; 
} 
+0

여기에 : https://msdn.microsoft.com/en-us//library/bb383977.aspx –

+0

나도 알아, 필자는 그것을 이미 보았지만 실제로는 이해하지 못한다. –

+4

이것은 단지 열거 형 버전의'Enumerable.Where'입니다. – Lee

답변

9

귀하의 위의 코드는 단순히 컬렉션을 반복 처리 술어와 일치하는 항목 만 반환하는 extension method입니다 : 새를 만들지 않고

확장 방법은 기존의 유형에 방법을 "추가"할 수 있습니다를 파생 형식, 다시 컴파일 또는 원래 형식을 수정합니다.

저는 이것을 LINQ 메서드라고 부릅니다. 확장 메서드에서 사용한 것처럼 대부분의 LINQ 메서드는 유창합니다 (체인을 연결할 수 있음). 그러나이 경우 Where과 같은 메서드를 실행하면 deferred이됩니다 (즉, 항목은 차례대로 사용됩니다. 요청할 때). 반면에 당신의 것은 즉시 실행되고 전체 입력 시퀀스를 한 번에 모두 소비합니다.

yield return로 :

public static IEnumerable<TSource> VisitorWhere<TSource>(this IEnumerable<TSource> enumerable, Predicate<TSource> compareMethod) 
{ 
    foreach (TSource item in enumerable) 
    { 
     if (compareMethod(item)) 
     { 
     yield return item; 
     } 
    } 
} 
+1

당신을 진심으로 환영합니다. 참고 btw : 철자가있는 "지연된"("다릅니다") ;-) 아, 또 다른 메모 (내가 편집하지는 않았지만) : 기본적으로 지연된 실행이 LINQ 메서드의 필수 특성임을 나타냅니다. 그것은 사실이 아닙니다. 시퀀스를 열심히 평가하는 여러 LINQ 연산자가 있습니다. 예 : 'Count','OrderBy' 등. 그들은해야 할 일을하기 위해서해야합니다. 반면,'Where'는 느슨하게 평가하거나 지연된 방식으로 실행하는 동안 수행 할 수있는 작업을 수행 할 수 있으므로 구현해야하는 방식에 동의합니다. – stakx

+0

@stakx - 예, 가장 의미있는 것은 유창하고 지연되었습니다. 기본적으로 LINQ 메서드가되기 위해서는 해당 네임 스페이스 아래에 있어야합니다. :) 그러나 필요한 경우 해당 개체의 지연 부분입니다. –

1

그것은 가령하는 방법 술어에서 제공하는 조건을 사용하여 방문자 목록을 필터링하십시오.

List<string> daveVisitors = visitorList.VisitorWhere(daveFinder).ToList(); 

기쁨 "데이브"- 하나 개의 항목이있는 IEnumerable을 반환합니다 확장 방법을 사용

Predicate<string> daveFinder = (string s) => {return s=="dave";}; 

: 다음 조건으로

List<string> visitorList = new List<string>(){"dave", "clare", "steve"}; 

: 당신은 목록이있는 경우 제네릭 형식의 의미는 개체와 해당 술어의 맛을 포함하는 IEnumerable을 자유롭게 제공 할 수 있으며 확장 메서드가 여전히 작동한다는 것을 의미합니다.

관련 문제