我已经创建了一个派生集合对象来引入一些新增的功能来过滤集合中的活动记录,如下面的代码片段所示。如何实现它,因为我只想过滤相同的集合,同时在过滤器中保留原始引用而不创建副本。
public class ExtendedTypes : List<ExtendedType>
{
public ExtendedTypes Active
{
get { return this.Where(x => x.IsActive).ToList(); } // Compile Error
}
}发布于 2014-07-30 18:57:51
过滤现有列表
您提到希望只过滤现有列表而不保留副本。在这种情况下,创建一个List是不行的,因为从子集创建一个列表总是会创建一个新集合,而不仅仅是一个过滤器。List<T>不是一个评估迟缓的集合。
您可能需要做的是将Active定义为IEnumerable<ExtendedType>并直接返回Where的结果(使用LINQ的惰性实现),或者,如果您在WPF中,可以在集合的基础上使用像CollectionView这样的附加滤波器,如下所示:
public ICollectionView ActiveTypes
{
get
{
if (_activeTypes == null)
{
_activeTypes = CollectionViewSource.GetDefaultView(myExtendedTypes);
_activeTypes.Filter = (type) => (type as ExtendedType).IsActive;
}
return _activeTypes;
}
}现在,您可以绑定到ActiveTypes,并且只获得由Filter子句的结果过滤的原始列表的一个子集。
创建一个新的列表
但是,假设ExtendedType是引用类型,则不必担心通过复制列表来复制项目本身的副本。如果您不介意使用相同的引用创建列表的副本,请使用我的原始答案:
编译器是正确的,因为ExtendedTypes是一个List<ExtendedType>,但不是相反的,而ToList()创建了一个List<ExtendedType>。
然而,有一个简单的解决办法。而不是ToList,只创建一个新的ExtendedTypes,构造函数从集合中初始化:
public class ExtendedTypes : List<ExtendedType>
{
public ExtendedTypes (IEnumerable<ExtendedType> items) : base(items)
{}
public ExtendedTypes Active
{
get { return new ExtendedTypes(this.Where(x => x.IsActive)); }
}
}https://stackoverflow.com/questions/25044704
复制相似问题