2010-04-25 2 views
5

MSDN의는 Func Generic Delegate의 문서에서이 코드 예제를 제공합니다Func <> 대리자에 대한이 MSDN 예제에 불필요한 Select() 호출이있는 이유는 무엇입니까?

Func<String, int, bool> predicate = (str, index) => str.Length == index; 

String[] words = { "orange", "apple", "Article", "elephant", "star", "and" }; 
IEnumerable<String> aWords = words.Where(predicate).Select(str => str); 

foreach (String word in aWords) 
    Console.WriteLine(word); 

내가 모든 일이 무엇을하고 있는지 이해합니다. 내가 이해할 수없는 것은

Select(str => str) 

비트입니다. 확실히 그게 필요하지 않은가? 당신이 그것을 생략하고 바로

IEnumerable<String> aWords = words.Where(predicate); 

이있는 경우 당신은 여전히 ​​같은 결과를 포함하는 IEnumerable을 다시 얻고, 코드는 같은 일을 인쇄합니다.

내가 누락되었거나 오해의 소지가 있습니까?

+0

예제에는 'Func predicate = str => str.ToUpper()'및'Select '가 없습니다. – zneak

+1

나는 위의 질문에 나타난 바와 같이 이것을 보았습니다. –

+0

@zneak - 선택한 언어는 무엇입니까? – ChrisF

답변

9

Select 실제로 중복입니다.

내가 같이,이 예제 쿼리 이해 구문에서 "번역"한 것으로 의심이 구문을 사용하는 경우

IEnumerable<String> aWords = 
    from w in words 
    where (...) 
    select w; 

, 당신 이 말에 select을 가지고, 그냥 방법을이다 컴파일러가 작동합니다. 그러나 Where 확장 방법을 사용할 때 별도의 투영을 실제로 수행해야하는 경우가 아니면 완전히 필요하지 않습니다.

아니면 그냥 실수 일 수 있습니다. MSDN 작성자는 오류가 없습니다!

+0

이것은 람다 구문이 더 효율적이라는 것을 의미합니까? – fearofawhackplanet

+0

@fearofawhackplanet : 그들은 동일합니다. 동일한 쿼리를 작성하는 다른 방법 일뿐입니다. – Aaronaught

1

아니요, 필요하지 않습니다.

시퀀스를 느리게 평가하여 캐스팅을 방지하려는 경우 이러한 구성을 사용할 수 있습니다. List<T>을 리턴했지만 IEnumerable<T> 리턴 유형을 선언 한 메소드가있는 경우, 클라이언트는 리턴 유형을 형변환하여 기본 목록을 직접 조작 할 수 있습니다. 분명히 이것은 아주 나쁜 생각이지만, 클래스는 신원이 예에서 사용되는 등을 선택 적용하여 그 상태를 보호 할 수 :

public IEnumerable<T> Items 
{ 
    get { return privateList.Select(i => i); } 
} 
+1

그런 경우, 나는 "privateList.AsReadOnly();"를 반환 할 것입니다. 대신, IEnumerable 을 반환하는 경우에도 마찬가지입니다. ReadOnlyCollection에는 컬렉션 길이가 알려져 있으므로 일부 LINQ 연산자 (예 : ToArray())를 더 빠르게 만드는 ICollection이 구현되는 이점이 있습니다. – Daniel

0

실제로 필요하지 않습니다. msdn page 하단에 피드백 버튼이 있습니다. 그들에게 말해라. 선택은 필요 없다. SELECT 절 그냥이라는 단순한 사실 :

Select(str => str) 

그것은 문자열을 수신하고 같은 문자열 당신이 아주 이상한 링크가

0

를 출력합니다.

"[..이 항목은 시험판 문서이며 이후 릴리스에서 변경 될 수 있습니다 비어있는 항목은 자리 표시 자로 포함되어 있습니다]"

다음 상단에 다음이 항목에서는 TOC에없는, 그리고있다

첫 번째 줄은 작가 자신의 발언과 비슷합니다.

그리고 VS 2010 및 .NET 4.0이 방금 발표 되었기 때문에 이것은 시간이 지날수록 삭제되거나 대체되지 않은 깨진 주제입니다.내가 생각

,이 내용에 대해 이제 올바른 URL이 있습니다 : 그런데 http://msdn.microsoft.com/en-us/library/bb534303.aspx

, 당신은 어떻게 당신의 URL는 거죠? MSDN 검색 또는 다른 것을 통해서였습니까?