BindingList и LINQ? - PullRequest
       18

BindingList и LINQ?

13 голосов
/ 25 ноября 2008

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

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

Это скомпилировано, но не выполняется, что за хитрость?

Ответы [ 3 ]

18 голосов
/ 25 ноября 2008
new BindingList<MyObject>(orderedList.ToList())
3 голосов
/ 01 марта 2014

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

Тем не менее, вы можете легко получить 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()
2 голосов
/ 12 февраля 2009

Это выше работает только тогда, когда выбранная проекция вашего запроса linq явно указывается как MyObject, а не select new, которая создает экземпляр анонимного объекта. В таких случаях typeof (orderList.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> (параметры типа соответствуют свойствам, установленным в выбранной вами проекции)

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

...