簡體   English   中英

如何將列表集合轉換為派生集合對象?

[英]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類型,則不必擔心通過復制列表來制作項目本身的副本。 如果您不介意使用相同的引用創建列表的副本,請使用我的原始答案:

編譯器是正確的,從某種意義上來說, ExtendedTypesList<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM