Первые 6 с foreach .net 2.0 - PullRequest
       11

Первые 6 с foreach .net 2.0

1 голос
/ 07 января 2010

Привет мне нужно отсортировать список, а затем взять первые 6 в .net 2.0

например, код ниже сортирует, но не берет первые 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
            }
            );

Ответы [ 2 ]

3 голосов
/ 07 января 2010

В .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 to Objects ...

Преимущество такого подхода состоит в том, что когда вы в конечном итоге перейдете на .NET 3.5 или более позднюю версию, у вас будет решение, которое можно легко превратить в идиоматический LINQ:

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

Обратите внимание, что проверка ошибок с блоками итератора немного сложна - вам нужно написать «обычный» метод, который выполняет проверку аргументов, а затем вызвать итератор отдельно; в противном случае исключение не будет выброшено, пока вы не начнете выполнять итерации.

1 голос
/ 07 января 2010

Почему бы вам не использовать простой цикл for в таком случае?

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]);
}

Последний вариант является лучшим, так как первый вариант вызовет исключение, если ваша коллекция содержит менее 6 элементов.

В любом случае, я думаю, что использование цикла for гораздо более читабельно в этом случае.

...