C# 如何限制foreach循环中迭代的元素数?

C# 如何限制foreach循环中迭代的元素数?,c#,loops,foreach,C#,Loops,Foreach,我有以下代码 foreach (var rssItem in rss.Channel.Items) { // ... } 但是只需要6个项目,而不是所有项目,如何在C#?中实现这一点只需迭代集合中的前6个: foreach(var rssItem in rss.Channel.Items.Take(6)) 使用: 注意 rss.Channel.Items.Take(6) 除了实例化IEnumerable的一个实现外,不执行任何操作,该实现可以迭代以生成枚举中的前六项。这是LINQ

我有以下代码

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

但是只需要6个项目,而不是所有项目,如何在C#?

中实现这一点只需迭代集合中的前6个:

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

注意

rss.Channel.Items.Take(6)
除了实例化
IEnumerable
的一个实现外,不执行任何操作,该实现可以迭代以生成枚举中的前六项。这是LINQ to对象的延迟执行特性

进一步注意,这是假定.NET3.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;
        }
    }
}

这假设.NET2.0。如果你不使用.NET 2,你应该认真考虑升级。

不要太明显,但是…

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

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

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

如果您想获得由某个特定用户创建的具有相同排序的

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

如果不想使用linq,也可以直接跳出循环

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

哪六个?有6个吗?前6名?随机6?满足某个标准的6?如果
var
在问题的示例代码中,当你说“太慢”时,它是C#3.0+,你指的是迭代集合所需的时间,还是发布答案太慢?收益率不在C#2中,如果开发人员仍在使用VS2005,Take必须构建并返回一个新的IEnumerable才能工作。不,
yield
是C#2.0。迭代器是在C#2.0/.NET2.0中引入的。如果序列没有索引器呢?例如,假设它是一个随机生成的数字的无限序列,它仍然适用于列表或数组,rss.Channel.Items可能就是这样。显然,如果Linq是一个选项,“Take”更简单。我建议对5.0版进行语言改进。对于(;;),++运算符等需要设置“oldschool”上下文,如我所说的当前“unsafe”。。。有时Linq和扩展方法不是您正在使用的框架版本的b/c选项。+1,有时您不能总是使用最新和最好的方法!:)
int max = Math.Min(6, rss.Channel.Items.Count);
for (int i = 0; i < max; i++)
{
   var rssItem = rss.Channel.Items[i];
   //...
}
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
}
        int count = 0;
        foreach (var rssItem in rss.Channel.Items)
        {
            if (++count == 6) break;
            ...
        }