C# BindingList和LINQ?

C# BindingList和LINQ?,c#,.net,linq,.net-3.5,c#-3.0,C#,.net,Linq,.net 3.5,C# 3.0,我是Linq的新手,我想对BindingList中的一些数据进行排序。完成Linq查询后,我需要使用BindingList集合来绑定数据 var orderedList = //Here is linq query return (BindingList<MyObject>)orderedList; 这个已编译但执行失败,诀窍是什么?仅当linq查询的select投影显式键入为MyObject而不是select new时,上面的方法才起作用,它会创建匿名对象的实例。在这种情况下

我是Linq的新手,我想对BindingList中的一些数据进行排序。完成Linq查询后,我需要使用BindingList集合来绑定数据

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

这个已编译但执行失败,诀窍是什么?

仅当linq查询的select投影显式键入为MyObject而不是select new时,上面的方法才起作用,它会创建匿名对象的实例。在这种情况下,typeoforderedList.ToList最终类似于以下内容:System.Collections.Generic.List

new BindingList<MyObject>(orderedList.ToList())
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'
在第二种情况下,它们的typeofresult为:System.Collections.Generic.List类型参数与选择投影中设置的属性相匹配


引用:

您不能总是将任何集合类型强制转换为任何其他集合。关于编译器何时检查强制转换,请查看上的这篇文章

但是,您可以通过自己执行一些管道操作,轻松地从可枚举项生成BindingList。只需在任何可枚举类型上添加以下扩展方法,即可将集合转换为BindingList

C:

静态类扩展方法 { 公共静态绑定列表到绑定列表此IEnumerable范围 { 返回新的BindingListrange.ToList; } } //这样使用: var newBindingList=from i in new[]{1,2,3,4}选择i.ToBindingList; VB:

模块扩展方法 _ 将TByVal range的绑定列表作为IEnumerableOf T作为BindingListOf T的公共函数 返回Trange.ToList的新BindingListOf 端函数 端模块 "这样使用: Dim newBindingList=从{1,2,3,4}中的i到bindinglist
这不会破坏列表中订阅事件的任何人吗?当t实现INotifyPropertyChanged时,通过迭代范围并将每个项直接添加到BindingList,您的效率可以提高一倍左右。实际上,range.ToList将枚举range以将每个项添加到列表中,然后BindingList将再次枚举该列表以将PropertyChanged事件处理程序连接到每个项。跳过。ToList可以提高大型集合的性能。