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);