简体   繁体   English

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

[英]How do I limit the number of elements iterated over in a foreach loop?

I have the following code 我有以下代码

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

But only want 6 items not all items, how can I do it in C#? 但是只想要6个项目而不是所有项目,我怎么能用C#做呢?

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

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

Not to be too obvious but... 不要太明显,但......

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

I know it's old school, and not filled with all sorts of Extension method goodness, but sometimes the old school still works... especially if you're still using .NET 2.0. 我知道这是旧学校,并没有充满各种扩展方法的优点,但有时老学校仍然有效...特别是如果你还在使用.NET 2.0。

Use Enumerable.Take : 使用Enumerable.Take

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

Note that 注意

rss.Channel.Items.Take(6)

does not do anything except instantiate an implementation of IEnumerable that can be iterated over to produce the first six items in the enumeration. 除了实例化IEnumerable的实现之外什么都不做,可以迭代生成枚举中的前六项。 This is the deferred execution feature of LINQ to Objects. 这是LINQ to Objects的延迟执行功能。

Note further that this assumes .NET 3.5. 请进一步注意,这假定为.NET 3.5。 If you are working with an earlier version of .NET, you could use something along the lines of the following: 如果您使用的是早期版本的.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;
        }
    }
}

Then: 然后:

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

This assumes .NET 2.0. 这假设是.NET 2.0。 If you're not using .NET 2.0 you should seriously consider upgrading. 如果您不使用.NET 2.0,则应认真考虑升级。

If you're interested in a condition (ie ordering by date created ) 如果您对条件感兴趣(即按创建日期排序

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

Perhaps if you want to get those created by a certain user , with that same sort 也许如果你想获得由某个用户创建的那些,具有相同的类型

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

You could also just break out of the loop if you don't want to use linq. 如果你不想使用linq,你也可以摆脱循环。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM