Ответ 1
new BindingList<MyObject>(orderedList.ToList())
Я новичок в Linq, и я хотел бы отсортировать некоторые данные, которые находятся в BindingList. После того, как я выполнил свой запрос Linq, мне нужно использовать коллекцию BindingList для привязки моих данных.
var orderedList = //Here is linq query
return (BindingList<MyObject>)orderedList;
Это скомпилировано, но не выполняется, каков трюк?
new BindingList<MyObject>(orderedList.ToList())
Это выше работает только тогда, когда ваш запрос выбора запроса linq явно вводится как MyObject, а не выбирает new, который создает экземпляр анонимного объекта. В таких случаях тип (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 (result): System.Collections.Generic.List < < > f__AnonymousType2 > (параметры типа соответствуют свойствам, заданным в выбранной проекции)
Вы не всегда можете использовать любой тип коллекции в любой другой коллекции. С точки зрения того, когда компилятор проверяет кастинг, проверьте этот пост на Время компиляции и время выполнения
Однако вы можете легко создать BindingList
из перечислимого, выполнив часть сантехники самостоятельно. Просто добавьте следующий метод расширения на любой тип Enumerable, чтобы преобразовать коллекцию в BindingList.
С#:
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()