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

前端 未结 6 2108
伪装坚强ぢ
伪装坚强ぢ 2021-02-05 08:34

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条回答
  • 2021-02-05 08:51

    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.

    0 讨论(0)
  • 2021-02-05 08:55

    If you're interested in a condition (i.e. 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
    }
    
    0 讨论(0)
  • 2021-02-05 09:01

    You could also just break out of the loop if you don't want to use linq.

            int count = 0;
            foreach (var rssItem in rss.Channel.Items)
            {
                if (++count == 6) break;
                ...
            }
    
    0 讨论(0)
  • 2021-02-05 09:01
    rss.Channel.Items.Take(6)
    
    0 讨论(0)
  • 2021-02-05 09:02

    just iterate over the top 6 from the collection:

    foreach(var rssItem in rss.Channel.Items.Take(6))
    
    0 讨论(0)
  • 2021-02-05 09:15

    Use 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. This is the deferred execution feature of LINQ to Objects.

    Note further that this assumes .NET 3.5. If you are working with an earlier version of .NET, you could use something along the lines of the following:

    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. If you're not using .NET 2.0 you should seriously consider upgrading.

    0 讨论(0)
提交回复
热议问题