gpt4 book ai didi

c# - 如何将列表集合转换为派生集合对象?

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:54 24 4
gpt4 key购买 nike

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

public class ExtendedTypes : List<ExtendedType>
{
public ExtendedTypes Active
{
get { return this.Where(x => x.IsActive).ToList(); } // Compile Error
}
}

最佳答案

过滤现有列表

您提到您只想过滤现有列表而不保留副本。在这种情况下,创建一个 List不会这样做,因为从子集创建列表将始终创建一个新集合,而不仅仅是一个过滤器。 List<T>不是延迟评估的集合。

您可能需要做的是定义 Active作为IEnumerable<ExtendedType>并返回 Where 的结果直接(使用 LINQ 的惰性实现),或者,如果您在 WPF 中,请使用类似 CollectionView 的东西作为additional filter在集合之上,像这样:

public ICollectionView ActiveTypes 
{
get
{
if (_activeTypes == null)
{
_activeTypes = CollectionViewSource.GetDefaultView(myExtendedTypes);
_activeTypes.Filter = (type) => (type as ExtendedType).IsActive;
}
return _activeTypes;
}
}

您现在可以绑定(bind)到 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)); }
}
}

关于c# - 如何将列表集合转换为派生集合对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25044704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com