如何按照相反的顺序迭代 .Net 的 IList 集合?

5

我有一个包含项的IList(从父项开始),它们需要以相反的顺序添加到图表文档中,以便最后添加父项,并在顶部绘制,以便用户首先选择。

怎么做才是最好的方法?是否有比我目前所做的更好/更优雅的方法?我在下面发布当前的方法...

4个回答

7
如果您有.NET 3.5,您可以使用LINQ的Reverse?
foreach(var item in obEvtArgs.NewItems.Reverse())
{
   ...
}

(假设您正在讨论通用的IList)
注:此处指的是通用的IList接口。

我差点放弃了,因为在智能感知中找不到System.Linq命名空间。我正在使用NotifyCollectionChangedEventArgs,它使用System.Collections.IList..所以无论如何我都不能Reverse()..谢谢。已投票支持。 - Gishu
你可以始终使用 (new List<Object>(obEvtArgs.NewItems)).Reverse(),但这会导致更高的内存使用和较低的性能。 - Davy Landman
对我来说,for循环更加熟悉和易读。总有一天需要熟悉LINQ... - Gishu
这会使用反向索引还是导致复制? - M.kazem Akhgary

2
根据对Davy's answerGishu's original answer的评论,您可以使用System.Linq.Enumerable.Cast扩展方法将弱类型的System.Collections.IList转换为泛型集合:
var reversedCollection = obEvtArgs.NewItems
  .Cast<IMySpecificObject>( )
  .Reverse( );

这将消除反向 for 循环和 as 转换以从原始集合中获取强类型对象的噪音。

0

NewItems是我的List... 不过这样有点笨重。

for(int iLooper = obEvtArgs.NewItems.Count-1; iLooper >= 0; iLooper--)
            {
                GoViewBoy.Document.Add(CreateNodeFor(obEvtArgs.NewItems[iLooper] as IMySpecificObject, obNextPos));
            }

1
为什么不把这个问题包含在问题中呢?为什么要发布为答案? - Eric Schoonover
从常见问题解答中: 我可以回答自己的问题吗?如果这不是一个问题呢? 最好实际提交一个答案,而不仅在问题本身回答。这使得答案可以被投票并公平地评估与其他人的答案相比。 - digiguru

0

你不需要LINQ:

var reversed = new List<T>(original); // assuming original has type IList<T>
reversed.Reverse();
foreach (T e in reversed) {
  ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接