如何使用ICollectionView中的信息从集合中删除项目?

时间:2013-12-08 10:19:59

标签: c#

我有一个集合

ObservableCollection<PathInfo> _pathInfos = new ObservableCollection<PathInfo>();

和相应的排序视图:

  CollectionView _sortedPathInfos = CollectionViewSource.GetDefaultView(_pathInfos);
  _sortedPathInfos.SortDescriptions.Add(new SortDescription("LastAccess", ListSortDirection.Descending));

现在我想确保源集合中的_maxItems不超过_maxItems。应删除超过最大计数的最旧项目。 要实现这一点,我必须编写很多行代码:

private void ensureCount()
{
  var removes = new List<PathInfo>();

  int count = 0;
  foreach (PathInfo info in _sortedPathInfos)
  {
    if (++count > _maxItems)
      removes.Add(info);
  }

  foreach (var remove in removes)
    _pathInfos.Remove(remove);
}

有更好(更短)的方法吗?

2 个答案:

答案 0 :(得分:0)

LINQ可以帮到你。

怎么样?
_sortedPathInfos.View.Skip(_maxItems).ToList().ForEach(x => _pathInfos.Remove(x));

ObservableCollection不支持RemoveRange,并且每次从_pathInfos中删除某些内容时都会触发“删除元素”事件,这在我看来处理大型列表时非常低效。

Why does ObservableCollection not support bulk changes?如果你感兴趣的话,这个帖子几乎没有什么可能的修复。

答案 1 :(得分:0)

使用LINQ,您可以使用“Take”从不可数的数量中获取所需数量的元素:

_sortedPathInfos.Take(20);

查看:http://msdn.microsoft.com/en-us/library/bb503062%28v=vs.90%29.aspx