BindingList и LINQ?

Я новичок в Linq, и я хотел бы отсортировать некоторые данные, которые находятся в BindingList. Как только я сделал запрос Linq, мне нужно использовать коллекцию BindingList для привязки моих данных.

 var orderedList = //Here is linq query
 return (BindingList<MyObject>)orderedList;

это скомпилировано, но не выполняется, в чем трюк?

3 ответов


new BindingList<MyObject>(orderedList.ToList())

вы не всегда можете привести какой-либо тип коллекции в любую другую коллекцию. С точки зрения того, когда компилятор проверяет кастинг, проверьте этот пост на время компиляции против выполнения кастинга

однако, вы можете легко произвести BindingList из перечислимых по водопроводным себя. Просто добавьте следующий метод расширения в любой перечисляемый тип, чтобы преобразовать коллекцию в Класс 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();

В. Б.:

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()

это работает только тогда, когда проекция select вашего запроса linq явно типизирована как MyObject, а не select new, которая создает экземпляр анонимного объекта. В таких случаях typeof (orderedList.ToList ()) оказывается чем-то сродни этой: системе.Коллекции.Родовой.Списокf__AnonymousType1>

ie: это должно работать:

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) : Система.Коллекции.Родовой.Listf_ _ AnonymousType2> (параметры типа соответствуют свойствам, заданным в выбранной проекции)

ссылка: http://blogs.msdn.com/swiss_dpe_team/archive/2008/01/25/using-your-own-defined-type-in-a-linq-query-expression.aspx