如何限制在foreach循环中迭代的元素数量?

时间:2010-01-06 16:21:06

标签: c# loops foreach

我有以下代码

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

但是只想要6个项目而不是所有项目,我怎么能用C#来做?

6 个答案:

答案 0 :(得分:55)

只是从集合中迭代前6位:

foreach(var rssItem in rss.Channel.Items.Take(6))

答案 1 :(得分:13)

不要太明显但是......

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。

答案 2 :(得分:5)

使用Enumerable.Take

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

请注意

rss.Channel.Items.Take(6)

除了实例化IEnumerable的实现之外没有做任何事情,可以迭代生成枚举中的前六项。这是LINQ to Objects的延迟执行功能。

进一步注意,这假定为.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,则应认真考虑升级。

答案 3 :(得分:4)

如果您对某个条件感兴趣(例如按创建日期排序

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 :(得分:4)

如果你不想使用linq,你也可以摆脱循环。

        int count = 0;
        foreach (var rssItem in rss.Channel.Items)
        {
            if (++count == 6) break;
            ...
        }

答案 5 :(得分:3)

rss.Channel.Items.Take(6)