首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将列表集合转换为派生集合对象?

如何将列表集合转换为派生集合对象?
EN

Stack Overflow用户
提问于 2014-07-30 18:53:17
回答 1查看 295关注 0票数 2

我已经创建了一个派生集合对象来引入一些新增的功能来过滤集合中的活动记录,如下面的代码片段所示。如何实现它,因为我只想过滤相同的集合,同时在过滤器中保留原始引用而不创建副本。

代码语言:javascript
复制
public class ExtendedTypes : List<ExtendedType>
{
    public ExtendedTypes Active
    {
        get { return this.Where(x => x.IsActive).ToList(); } // Compile Error
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-30 18:57:51

过滤现有列表

您提到希望只过滤现有列表而不保留副本。在这种情况下,创建一个List是不行的,因为从子集创建一个列表总是会创建一个新集合,而不仅仅是一个过滤器。List<T>不是一个评估迟缓的集合。

您可能需要做的是将Active定义为IEnumerable<ExtendedType>并直接返回Where的结果(使用LINQ的惰性实现),或者,如果您在WPF中,可以在集合的基础上使用像CollectionView这样的附加滤波器,如下所示:

代码语言:javascript
复制
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,构造函数从集合中初始化:

代码语言:javascript
复制
public class ExtendedTypes : List<ExtendedType>
{
    public ExtendedTypes (IEnumerable<ExtendedType> items) : base(items)
    {}

    public ExtendedTypes Active
    {
        get { return new ExtendedTypes(this.Where(x => x.IsActive)); } 
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25044704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档