[英]How to cast list collection to derived collection object?
我創建了一個派生的集合對象,以引入一些附加功能來過濾集合中的活動記錄,如下面的代碼片段所示。 如何實現它,因為我只想過濾相同的集合,同時將原始引用保留在過濾器中而不創建副本。
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
類的東西作為頂部的附加過濾器像這樣的集合:
public ICollectionView ActiveTypes
{
get
{
if (_activeTypes == null)
{
_activeTypes = CollectionViewSource.GetDefaultView(myExtendedTypes);
_activeTypes.Filter = (type) => (type as ExtendedType).IsActive;
}
return _activeTypes;
}
}
現在,您可以綁定到ActiveTypes
並僅獲取原始列表的一部分,並通過Filter
子句的結果進行Filter
。
創建一個新列表
但是,假設ExtendedType
是Reference類型,則不必擔心通過復制列表來制作項目本身的副本。 如果您不介意使用相同的引用創建列表的副本,請使用我的原始答案:
編譯器是正確的,從某種意義上來說, 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)); }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.