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

C# 如何使用ICollectionView中的信息从集合中删除项?,c#,C#,我有一个收藏 ObservableCollection<PathInfo> _pathInfos = new ObservableCollection<PathInfo>(); 现在,我想确保源集合中不超过_maxItems。应移除超过最大数量的最旧项目。 为了实现这一点,我必须编写相当多的代码行: private void ensureCount() { var removes = new List<PathInfo>(); int count

我有一个收藏

ObservableCollection<PathInfo> _pathInfos = new ObservableCollection<PathInfo>();
现在,我想确保源集合中不超过_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);
}
private重新计票()
{
var removes=新列表();
整数计数=0;
foreach(路径信息中的路径信息)
{
如果(++计数>\u最大项)
删除。添加(信息);
}
foreach(移除中的var remove)
_移除(移除);
}
有更好(更短)的方法吗?

LINQ可以帮助您

那怎么办

_sortedPathInfos.View.Skip(_maxItems).ToList().ForEach(x => _pathInfos.Remove(x));
ObservableCollection不支持RemoveRange,每次从pathInfos中删除某些内容时都会触发“element removed”事件,在我看来,在处理大型列表时,这是非常低效的

如果您感兴趣,此线程几乎没有潜在的修复方法。

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

_sortedPathInfos.Take(20);

请看:

您在哪里找到可以删除
IEnumerable
ObservableCollection.Remove
方法?这就是为什么我说您可能需要添加.ToList()。您总是可以创建自己的扩展方法。关键是没有这样一种方法
Remove
具有这样的重载
Remove
只接受类型为
T
的实例,在这种情况下,它是
PathInfo
,而不是
List
IEnumerable
的实例。你甚至不觉得这是错的?这是指向
ObservableCollection的描述的链接。从MSDN中删除
方法好吧,我误解了。换了我的职位。谢谢。我尝试了与LINQ相关的解决方案(使用System.LINQ;),但我得到了错误“CS1061”,这意味着Skip()未作为ICollectionView的成员找到,并且不存在此类扩展方法。但是Take()返回结果,它不修改源集合。所以这不是解决办法。还是我错过了什么?
_sortedPathInfos.Take(20);