【问题标题】:Iterating through ListCollectionView using foreach使用 foreach 遍历 ListCollectionView
【发布时间】:2012-05-20 03:04:40
【问题描述】:

由于 ListCollectionView 不支持索引器(例如 View[0]),我发现迭代过滤/排序列表的唯一方法是使用 foreach。

1) foreach 是否会确保在迭代期间保留视图中的项目顺序?如果没有,还有什么办法?

2) 是否有强类型 ListCollectionView?我错过了很多 linq 扩展方法,并且有很多 FindMaxThis、FindFirstThat... :)

【问题讨论】:

  • 从逻辑上讲,似乎迭代保留了顺序,否则可能会得到不同的结果,因为这是第 n 次迭代。迭代不能是随机结果生成器。
  • 好吧,我记得有一次我读过它,答案是:取决于它正在迭代的集合......如果你看一下 SO,你会发现那里有类似的问题。无论如何, List 肯定会保持秩序,我一直在使用 List,所以我很安全

标签: c# .net wpf


【解决方案1】:

1) 当您将 foreach 与 ListCollectionView 一起使用时,您可能会从基础集合(InternalList 属性)中获得一个 Enumerator。如果您使用 List 的实例对其进行初始化,那么您可以非常确定枚举将按顺序进行。

2) 有两种选择。首先,您可以使用内部列表并将其转换为强类型集合或将对它的引用存储在类中的某个位置。二是直接在 ListCollectionView 实例上使用 Cast。对于性能关键型应用,我会选择第一种方法。

var collection = new ListCollectionView(new List<int>());
var even = collection
    .Cast<int>()
    .Where(n => n%2 == 0);

【讨论】:

  • 嗨,至于数字 2),我不能使用 SourceCollection 属性(内部列表),因为它包含所有项目,而不是过滤/排序的。这将产生与预期结果不同的结果。并且由于 Cast 调用每次都会创建新的可枚举集合,因此会产生糟糕的性能。我不确定为什么 wppf 中没有任何强类型的可编辑集合视图。
猜你喜欢
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2019-11-02
  • 2013-03-17
  • 2019-08-03
  • 2016-05-21
  • 2016-04-06
相关资源
最近更新 更多