linq填充自定义集合

时间:2010-02-02 22:43:37

标签: linq collections

我有一个定义为:

的集合
public class MyCollection : List<MyItem>
{
    ...
}
public class MyItem
{
    ...
}

使用linq,我可以使用Select方法返回一个IEnumerable,我可以在其上调用.ToList来获取IList但是有没有办法找回一种类型的MyCollection?因为我要实例化一个具有MyCollection类型属性的类,并且我想使用对象初始化。

例如:

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

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

我收到编译错误,因为ToList返回List并且它无法转换为MyCollection对象。有没有办法做到这一点?

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:1)

您需要使用MyCollection构建IEnumerable<MyItem>个实例。添加如下构造函数:

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

然后,当你去使用它时,你可以这样做:

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

答案 2 :(得分: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 = ...;
  ...
}