嗨,我需要对列表进行排序,然后取.net 2.0中的前6个列表
例如,下面的代码排序,但不接受前6,我该怎么做呢?
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
}
);发布于 2010-01-07 18:46:21
在.NET 3.5中,规范的答案是使用Take。幸运的是,您可以很容易地为.NET 2.0编写以下代码:
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;
}
}
}然后您可以执行以下操作:
foreach (SimplifiedFeedItem item in Take(allFeeds, 6))
{
// Do stuff
}或者,你也可以只获得LINQBridge,并拥有整个LINQ to Objects供你使用……
这样做的好处是,当你最终升级到Linq3.5或更高版本时,你将拥有一个可以非常容易地转换为惯用.NET的解决方案:
foreach (SimplifiedFeedItem item in allFeeds.Take(6))请注意,迭代器块的错误检查有一点棘手-您需要编写一个“普通”方法来执行参数检查,然后单独调用迭代器;否则直到开始迭代时才会抛出异常。
发布于 2010-01-07 18:45:52
在这种情况下,为什么不使用简单的for循环呢?
allFeeds.Sort (...);
for( int i = 0; i < 6; i++ )
{
DoSomething (allFeeds[i]);
}或
allFeeds.Sort (...);
for( int i = 0; i < allFeeds.Count; i++ )
{
if( i == 6 ) break;
DoSomething(allFeeds[i]);
}后者是更好的选择,因为当您的集合包含的元素少于6个时,第一个选项将抛出异常。
无论哪种方式,我认为在这种情况下使用for循环更具可读性。
https://stackoverflow.com/questions/2019617
复制相似问题