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;
...
}