2.0

2010-01-07 2 views
1

안녕 내가 종류 아래 예를 들어 .NET 2.02.0

의 코드를 첫 6을 다음 목록을 정렬 할 필요가 있지만, 우선이 어떻게 할 수있는 6하지 않는 foreach는 .NET 6 먼저?

  allFeeds.Sort(delegate(SimplifiedFeedItem p1, SimplifiedFeedItem p2) 
      { return -p1.PublishDate.CompareTo(p2.PublishDate); }); 
      allFeeds.ForEach(delegate(SimplifiedFeedItem p) 
      { 
       // do for the first 6 items only 
      } 
      ); 

답변

3

.NET 3.5에서 정식 답은 Take을 사용하는 것입니다. 다행히, 당신이 .NET 2.0 매우 쉽게 쓸 수 있습니다 :

public static IEnumerable<T> Take<T>(IEnumerable<T> source, int limit) 
{ 
    // Error checking omitted 
    using (IEnumerator<T> iterator = source.GetEnumerator()) 
    { 
     for (int i = 0; i < limit; i++) 
     { 
      if (!iterator.MoveNext()) 
      { 
       yield break; 
      } 
      yield return iterator.Current; 
     } 
    } 
} 

그런 다음 당신이 할 수 있습니다

foreach (SimplifiedFeedItem item in Take(allFeeds, 6)) 
{ 
    // Do stuff 
} 

을 다른 방법으로, 당신은 단지 LINQBridge 잡아 가능한 객체에 LINQ의 전체를 가질 수있다 당신에게 ...

이런 식으로 일하는 장점은 결국 .NET 3.5 이상으로 업그레이드 할 때 매우 쉽게 관용적 인 LINQ로 바뀔 수있는 솔루션을 얻을 수 있다는 것입니다.

foreach (SimplifiedFeedItem item in allFeeds.Take(6)) 

반복기 블록을 사용한 오류 검사는 약간 까다 롭습니다. 인수 검사를 수행하는 "일반"방법을 작성하고 반복기를 개별적으로 호출해야합니다. 그렇지 않으면 반복을 시작할 때까지 예외가 throw되지 않습니다.

+0

+1 매우 우아합니다! –

1

그런 경우에 간단한 for 루프를 사용하지 않는 이유는 무엇입니까? 컬렉션 6 개 요소를 적은 다음이 포함되어있는 경우 첫 번째 옵션은 예외를 발생하기 때문에

allFeeds.Sort (...); 

for(int i = 0; i < 6; i++) 
{ 
    DoSomething (allFeeds[i]); 
} 

또는

allFeeds.Sort (...); 

for(int i = 0; i < allFeeds.Count; i++) 
{ 
    if(i == 6) break; 
    DoSomething(allFeeds[i]); 
} 

후자는 더 나은 옵션입니다.

어느 쪽이든, 저는 for 루프를 사용하는 것이 훨씬 더 읽기 쉽다고 생각합니다.