我是新的Linq,我想對BindingList中的一些數據進行排序。一旦我做了我的Linq查詢,我需要使用BindingList集合來綁定我的數據。BindingList和LINQ?
var orderedList = //Here is linq query
return (BindingList<MyObject>)orderedList;
這編譯但失敗執行,有什麼竅門?
我是新的Linq,我想對BindingList中的一些數據進行排序。一旦我做了我的Linq查詢,我需要使用BindingList集合來綁定我的數據。BindingList和LINQ?
var orderedList = //Here is linq query
return (BindingList<MyObject>)orderedList;
這編譯但失敗執行,有什麼竅門?
new BindingList<MyObject>(orderedList.ToList())
,上面當你的LINQ查詢的選擇投影顯式類型爲MyObject的,而不是選擇新的它創建一個匿名對象的實例纔有效。在這種情況下將typeof(orderedList.ToList())捲起,以這種類似的東西:System.Collections.Generic.List < <> f__AnonymousType1>
即:這應該工作:
var result = (from x in MyObjects
where (wherePredicate(x))
select new MyObject {
Prop1 = x.Prop1,
Prop2 = x.Prop2
}).ToList();
return new BindingList<MyObject>(result);
這不會:
var result = from x in db.MyObjects
where(Predicate(x))
select new {
Prop1 = x.Prop1
Prop2 = x.Prop2
};
return new BindingList<MyObject>(result.ToList())
//creates the error: CS0030 "Cannot convert type 'AnonymousType#1' to 'MyObject'
在他們的typeof(結果)第二種情況是:System.Collections.Generic.List < <> f__AnonymousType2>(類型PARAMS匹配您選擇投影設置屬性)
你不能總是施放任何集合類型到任何其他集合。在編譯器檢查鑄件的時候,看看這個貼子Compile-time vs runtime casting
但是,你可以通過自己做一些管道來輕鬆地從enumerable生成BindingList
。只需將以下擴展方法添加到任何Enumerable類型以將集合轉換爲BindingList。
C#:
static class ExtensionMethods
{
public static BindingList<T> ToBindingList<T>(this IEnumerable<T> range)
{
return new BindingList<T>(range.ToList());
}
}
//use like this:
var newBindingList = (from i in new[]{1,2,3,4} select i).ToBindingList();
VB:
Module ExtensionMethods
<Extension()> _
Public Function ToBindingList(Of T)(ByVal range As IEnumerable(Of T)) As BindingList(Of T)
Return New BindingList(Of T)(range.ToList())
End Function
End Module
'use like this:
Dim newBindingList = (From i In {1, 2, 3, 4}).ToBindingList()
這會不會打破誰的訂閱列表上的事件誰? – GWLlosa 2009-07-16 19:14:11