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

tes*_*est 17 c# foreach loops

我有以下代码

foreach (var rssItem in rss.Channel.Items)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

hac*_*sid 58

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

foreach(var rssItem in rss.Channel.Items.Take(6))
Run Code Online (Sandbox Code Playgroud)

  • 当你说"太慢"时,你指的是迭代收集所花费的时间还是发布答案的速度太慢? (6认同)

Nic*_*ick 13

不要太明显,但......

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

我知道这是旧学校,并没有充满各种扩展方法的优点,但有时老学校仍然有效...特别是如果你还在使用.NET 2.0.

  • 如果序列没有索引器怎么办?例如,假设它是随机生成的数字的无限序列. (2认同)

jas*_*son 5

用途Enumerable.Take:

foreach(var rssItem in rss.Channel.Items.Take(6)) {
    // go time!
}
Run Code Online (Sandbox Code Playgroud)

注意

rss.Channel.Items.Take(6)
Run Code Online (Sandbox Code Playgroud)

除了实例化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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

foreach(var rssItem in Take(rss.Channel.Items, 6)) {
    // go time!
}
Run Code Online (Sandbox Code Playgroud)

这假设是.NET 2.0.如果您不使用.NET 2.0,则应认真考虑升级.

  • 不,`yield`是C#2.0.迭代器是在C#2.0/.NET 2.0中引入的.比照 http://msdn.microsoft.com/en-us/library/dscyy5s0(VS.80).aspx和http://msdn.microsoft.com/en-us/library/9k7k7cf0(VS.80).aspx (3认同)

mdm*_*m20 5

如果您不想使用 linq,也可以跳出循环。

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