如何限制在foreach循环中迭代的元素数量?
我有以下代码
foreach (var rssItem in rss.Channel.Items) { // ... }
但是只想要6件物品而不是所有物品,我怎么能用C#做呢?
只是迭代集合中的前6位:
foreach(var rssItem in rss.Channel.Items.Take(6))
不要太明显,但……
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。
使用Enumerable.Take
:
foreach(var rssItem in rss.Channel.Items.Take(6)) { // go time! }
注意
rss.Channel.Items.Take(6)
除了实例化IEnumerable
的实现之外什么都不做,可以迭代生成枚举中的前六项。 这是LINQ to Objects的延迟执行function。
请进一步注意,这假定为.NET 3.5。 如果您使用的是早期版本的.NET,则可以使用以下内容:
static IEnumerable Take (IEnumerable 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,则应认真考虑升级。
如果您对条件感兴趣(即按创建日期排序 )
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 }
如果你不想使用linq,你也可以摆脱循环。
int count = 0; foreach (var rssItem in rss.Channel.Items) { if (++count == 6) break; ... }
rss.Channel.Items.Take(6)