2010-12-31 2 views
1

IEnumerable에 대한 FindAll 메서드를 사용하여 조건부 조건을 기준으로 필터링했습니다. 배열과 목록 모두에 공통입니다. 때문에 SIL은빛 창 전화 7에서 확장 메서드가 작동하지 않습니다.

에서 코드 : 내 응용 프로그램에서 나를 위해 작동하지 않는 이유

public static IEnumerable<T> FindAll<T>(this IEnumerable<T> tCollection, Func<T, bool> predicate) 
{ 
    if (null == tCollection) yield return default(T); 
    using (IEnumerator<T> iterator = tCollection.GetEnumerator()) 
    { 
      if (!iterator.MoveNext()) 
      { 
       yield return default(T); 
       yield break; 
      } 

      do 
      { 
       if (predicate(iterator.Current)) 
       yield return iterator.Current; 
      } 
      while (iterator.MoveNext()); 
    } 
} 

내가 부르고 때 나를 위해 작동하지 않습니다 ..

List<string> strings = new List<string> { "Kumaran", "Raj", "Kannan", "Karthi", "Gopal" }; 

    IEnumerable<string> str = strings.FindAll(item => item.StartsWith("K")); 

내가 알 수 있습니다.

+3

안녕 Dinesh "나에게 도움이 안된다"는 말에 정교하게 대답 해주세요. –

+0

목록이 비어 있거나 참조가 null 인 경우 왜 단일 요소를 생성 하시겠습니까 (기본값)? 목록에 항목이 있고 그 중 하나도 조건부와 일치하지 않는 경우 왜 그렇지 않습니까? 그리고 왜 당신은 내장 된'Enumerable.Where' 메서드를 사용하지 않는 것일까 요? –

+0

Silverlight에서 다른 동작이 나타나는 이유는'List '에 이미'FindAll' 메서드가 있기 때문에 메서드가 데스크톱 .NET에서 전혀 호출되지 않기 때문입니다 (이 경우와 같이 깨지지는 않습니다) . –

답변

3

여기 내 추측입니다 (실제 관련 코드를 모두 표시하지 않았을 수도 있음).

FindAll 메서드의 어딘가에 중단 점을 배치합니다. 그런 다음 줄을 실행하십시오. -

IEnumerable<string> str = strings.FindAll(item => item.StartsWith("K")); 

그러나 중단 점이 맞지 않습니다. 맞습니까?

그러나 이것은 맞습니다. 열거 자의 MoveNext에 대한 첫 번째 호출이 IEnumerable에서 수신되고 str에있을 때까지 FindAll 메서드가 실제로 호출되지 않습니다. 코드 foreachstr에 올리면 코드가 생성됩니다.

현재 구현이 약간 의심 스럽습니다. 소스가 null이거나 비어있을 때 반환되는 단일 기본값을 포함하는 열거 형을 사용하고 싶지 않으실 겁니까?

실제로 필터링 된 집합을 IEnumerable<T>에서 반환하려는 경우 대신 Linq Where 확장 메서드를 사용하십시오. 반면에 FindAll의 구현을 List 전체 .NET API에서 찾을 수 있도록 만들려는 경우 List<T>을 반환해야합니다. 당신이 정말로 FindAll 필요한 경우

IEnumerable<string> str = strings.Where(item => item.StartsWith("K")); 

와 - :

using System.Linq; 

는 다음 사용할 수 있습니다 -이 :

나는 당신이 정말 당신의 코드 파일이 using를 추가하는 일을해야한다는 생각 다음은 List<T>을 반환하는 기능입니다. -

List<string> str = strings.Where(item => item.StartsWith("K")).ToList(); 
관련 문제