2009-02-17 97 views

回答

2

我不确定你的要求是什么,特别是关于ToList的那一点不是你所需要的。

不幸的是,BindingList<T>只在其构造函数中接受IList<T>参数,而不是IEnumerable<T>

但是,如果您实现您的自定义集合直通构造函数(或者,如果它已经有一个构造函数IList<T>),那么你可以做一些与此类似:

public class MyListObject<T> : BindingList<T> 
{ 
    public MyListObject() : base() { } 
    public MyListObject(IList<T> list) : base(list) { } 
} 

// ... 

MyListObject<int> yourList = new MyListObject<int> { 1, 2, 3, 4, 5 }; 
yourList = new MyListObject<int>(yourList.Select(s => s * 2).ToList()); 
// yourList now contains 2, 4, 6, 8, 10 
1

大多数列表接受构造函数中的一系列对象。这会工作吗?

Dim objects = 'Linq statement returning IEnumberable array. 
Dim mlo As New MyListObject(objects) 
+0

不幸的是,的BindingList 只在其构造函数中接受IList ,而不是IEnumerable 。 – LukeH 2009-02-17 10:24:25

2

一种选择是使用/添加构造函数CStick建议采取的IEnumerable返回的IEnumerable的包装到您的收藏类型。或许有点更ellegant的方法是添加一个扩展方法的IEnumerable的类型,将返回您的收藏:

static MyListObject ToMyList(this IEnumerable<T> en) { 
    // construct your MyListObject from 'en' somehow 
} 


// And then just write: 
var mylist = (from c in ...).ToMyList() 

最后一个选项可能是太复杂了,这个简单的方案是实现所有LINQ查询操作为您类型(扩展方法Where,Select和许多其他)。更重要的是,你可以(也许)更有效率地做一些事情,但这确实有点难。

+0

我不明白你的意思是“从'en'以某种方式” – 2009-02-17 13:53:00

+0

好吧我只是看到它是你的变量名:P我会看看,这是我想要避免做循环的一点点手动。但是,好吧,如果这是唯一的方法... – 2009-02-17 14:00:36