Как я ограничиваю число элементов, выполненное с помощью итераций в цикле foreach?

У меня есть следующий код

foreach (var rssItem in rss.Channel.Items)
{
    // ...
}

Но только хотите 6 объектов не все объекты, как я могу сделать это в C#?

17
задан Mark Canlas 6 January 2010 в 16:43
поделиться

6 ответов

просто итерация над верхней 6-ой из коллекции:

foreach(var rssItem in rss.Channel.Items.Take(6))
58
ответ дан 30 November 2019 в 09:59
поделиться

Не слишком очевидно, но...

int max = Math.Min(6, rss.Channel.Items.Count);
for (int i = 0; i < max; i++)
{
   var rssItem = rss.Channel.Items[i];
   //...
}

Я знаю, что это старая школа, и она не наполнена всевозможными добрыми методами расширения, но иногда старая школа все еще работает... особенно, если ты все еще используешь .NET 2.0.

13
ответ дан 30 November 2019 в 09:59
поделиться

Используйте Enumerable.Take:

foreach(var rssItem in rss.Channel.Items.Take(6)) {
    // go time!
}

Обратите внимание, что

rss.Channel.Items.Take(6)

ничего не делает, кроме как инстанцинирует реализацию IEnumerable, которая может быть итерацирована для получения первых шести элементов в перечислении. Это функция отложенного выполнения LINQ для объектов.

Обратите внимание далее, что это предполагает .NET 3.5. Если вы работаете с более ранней версией .NET, вы можете использовать что-нибудь по следующей схеме:

static IEnumerable<T> Take<T>(IEnumerable<T> source, int take) {
    if (source == null) {
        throw new ArgumentNullException("source");
    }
    if (take < 0) {
        throw new ArgumentOutOfRangeException("take");
    }
    if (take == 0) {
        yield break;
    }
    int count = 0;
    foreach (T item in source) {
        count++;
        yield return item;
        if (count >= take) {
            yield break;
        }
    }
}

Тогда:

foreach(var rssItem in Take(rss.Channel.Items, 6)) {
    // go time!
}

Это предполагает .NET 2.0. Если вы не используете .NET 2.0, вам следует серьезно подумать об обновлении.

.
5
ответ дан 30 November 2019 в 09:59
поделиться

Если вас интересует условие (т.е. заказ по дате создания)

foreach(var rssItem in rss.Channel.Items.OrderByDescending(x=>x.CreateDate).Take(6)) 
{
//do something
}

Возможно, если вы хотите получить условия, созданные определенным пользователем, с таким же типом

foreach(var rssItem in rss.Channel.Items
                          .Where(x=>x.UserID == 1)
                          .OrderByDescending(x=>x.CreateDate)
                          .Take(6)) 
{
//do something
}
4
ответ дан 30 November 2019 в 09:59
поделиться
rss.Channel.Items.Take(6)
3
ответ дан 30 November 2019 в 09:59
поделиться

Вы также можете просто вырваться из цикла, если не хотите использовать linq.

        int count = 0;
        foreach (var rssItem in rss.Channel.Items)
        {
            if (++count == 6) break;
            ...
        }
4
ответ дан 30 November 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: