2010-02-02 60 views
0

我有一個集合定義爲:LINQ填入自定義集合

public class MyCollection : List<MyItem> 
{ 
    ... 
} 
public class MyItem 
{ 
    ... 
} 

使用LINQ,我可以使用選擇方法返回一個IEnumerable的,我可以叫.ToList上,要得到一個IList但有回收一種MyCollection的方式?因爲我打算實例化一個具有MyCollection類型屬性的類,並且我想使用對象初始化。

例如:

public class MyClass 
{ 
    MyCollection TestCollection {get;set} 
    ... 
} 

MyClass test = new MyClass() 
{ 
    ... 
    TestCollection = SomeObject.Select(item => new MyItem() 
    { 
     ... 
    }).ToList(); 
} 

我得到一個編譯錯誤,因爲ToList返回列表,它不能轉換爲MyCollection的對象。有沒有辦法做到這一點?

+0

Cast <>()不會工作,會嗎? – ziya 2010-02-02 22:53:41

+0

不,它給了一個無效的演員 – Jeremy 2010-02-02 22:58:24

回答

1

你需要構建您的MyCollection實例與IEnumerable<MyItem>。添加一個構造函數,如:

public MyCollection(IEnumerable<MyItem> items) : base(items) {} 

然後,當你去使用它,你可以這樣做:

TestCollection = new MyCollection(SomeObject.Select(item => new MyItem()); 
1

你可以做的是從IEnumerable建立您的收藏自己的擴展方法,像

public static class Extensions 
{ 
    public static MyCollection ToMyCollection(this IEnumerable<MyItem> items) 
    { 
     //build and return your collection 
    } 
} 

,或者MyItem是泛型類型在上下文中的佔位符:

public static class Extensions 
{ 
    public static MyCollection ToMyCollection<T>(this IEnumerable<T> items) 
    { 
     //build and return your collection 
    } 
} 
0

只是模仿ToList

public static class MyCollectionExtensions { 
    public static MyCollection ToMyCollection(this IEnumerable<MyItem> source) { 
    if (source == null) throw new NullReferenceException(); 
    return new MyCollection(source); 
    } 
} 

MyCollection需要一個新的構造:

public class MyCollection : List<MyItem> { 
    public MyCollection() : base() { } 
    public MyCollection(IEnumerable<MyItem> source) : base(source) { } 
    ... 
} 

另外,通常不建議爲集合公開setter。你應該在類中封裝集合的變異:

public class MyClass { 
    public MyCollection TestCollection { get { ... } } // should return a read-only collection 
    public void Add(MyItem item) { 
    _testCollection.Add(item); 
    } 
    MyCollection _testCollection = ...; 
    ... 
}