首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自foreach .net 2.0的前6个

问来自foreach .net 2.0的前6个
EN

Stack Overflow用户
提问于 2010-01-07 18:41:23
回答 2查看 94关注 0票数 1

嗨,我需要对列表进行排序,然后取.net 2.0中的前6个列表

例如,下面的代码排序,但不接受前6,我该怎么做呢?

代码语言:javascript
复制
          allFeeds.Sort(delegate(SimplifiedFeedItem p1, SimplifiedFeedItem p2)
            { return -p1.PublishDate.CompareTo(p2.PublishDate); });
            allFeeds.ForEach(delegate(SimplifiedFeedItem p)
            {
                // do for the first 6 items only
            }
            );
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-07 18:46:21

在.NET 3.5中,规范的答案是使用Take。幸运的是,您可以很容易地为.NET 2.0编写以下代码:

代码语言:javascript
复制
public static IEnumerable<T> Take<T>(IEnumerable<T> source, int limit)
{
    // Error checking omitted
    using (IEnumerator<T> iterator = source.GetEnumerator())
    {
        for (int i = 0; i < limit; i++)
        {
            if (!iterator.MoveNext())
            {
                yield break;
            }
            yield return iterator.Current;
        }
    }
}

然后您可以执行以下操作:

代码语言:javascript
复制
foreach (SimplifiedFeedItem item in Take(allFeeds, 6))
{
    // Do stuff
}

或者,你也可以只获得LINQBridge,并拥有整个LINQ to Objects供你使用……

这样做的好处是,当你最终升级到Linq3.5或更高版本时,你将拥有一个可以非常容易地转换为惯用.NET的解决方案:

代码语言:javascript
复制
foreach (SimplifiedFeedItem item in allFeeds.Take(6))

请注意,迭代器块的错误检查有一点棘手-您需要编写一个“普通”方法来执行参数检查,然后单独调用迭代器;否则直到开始迭代时才会抛出异常。

票数 3
EN

Stack Overflow用户

发布于 2010-01-07 18:45:52

在这种情况下,为什么不使用简单的for循环呢?

代码语言:javascript
复制
allFeeds.Sort (...);

for( int i = 0; i < 6; i++ )
{
   DoSomething (allFeeds[i]);
}

或

代码语言:javascript
复制
allFeeds.Sort (...);

for( int i = 0; i < allFeeds.Count; i++ )
{
    if( i == 6 ) break;
    DoSomething(allFeeds[i]);
}

后者是更好的选择,因为当您的集合包含的元素少于6个时,第一个选项将抛出异常。

无论哪种方式,我认为在这种情况下使用for循环更具可读性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2019617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档