C# BindingList和LINQ?
我是Linq的新手,我想对BindingList中的一些数据进行排序。完成Linq查询后,我需要使用BindingList集合来绑定数据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时,上面的方法才起作用,它会创建匿名对象的实例。在这种情况下
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可以提高大型集合的性能。