为BindingListView <T>启用LINQ

Ken*_*Ken 5 c# linq winforms

安德鲁·戴维斯创建了一个优秀的小类SourceForge上称为BindingListView<T>基本上可以让你收集绑定到DataGridView支持排序和过滤一段时间.DataGridView将a 绑定到法线List<T>不支持排序和过滤,因为没有实现正确的接口List<T>.

该课程运行良好,解决了我的UI问题.但是,如果我可以使用LINQ遍历集合,那将是非常棒的,但我只是不确定如何设置它.源代码可以在这里下载.谁能帮我吗?

Ric*_*key 8

由于该BindingListView<T>项目使用.NET Framework v2.0并且早于LINQ,因此它不会公开IEnumerable<T>您要查询的内容.由于它确实实现了非泛型IEnumerable和非泛型IList,因此您可以使用Enumerable.Cast<TResult>将集合转换为适合与LINQ一起使用的形式.然而,由于这种方法是不是有帮助IEnumerable的是AggregateBindingListView<T>返回与类型的内部数据结构KeyValuePair<ListItemPair<T>, int>.

要升级这个项目与LINQ使用方便,最简单的方法可能是实现IEnumerable<T>AggregateBindingListView<T>.首先将它添加到类的声明中:

public class AggregateBindingListView<T> : Component, IBindingListView, IList, IRaiseItemChangedEvents, ICancelAddNew, ITypedList, IEnumerable<T>
Run Code Online (Sandbox Code Playgroud)

然后在类定义的末尾实现它:

#region IEnumerable<T> Members

IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
    for (int i = 0; i < _sourceIndices.Count; i++)
        yield return _sourceIndices[i].Key.Item.Object;

}

#endregion
Run Code Online (Sandbox Code Playgroud)

现在你可以在这样的BindingListView<T>实例上直接使用LINQ :

// Create a view of the items
itemsView = new BindingListView<Item>(feed.Items);
var descriptions = itemsView.Select(t => t.Description);
Run Code Online (Sandbox Code Playgroud)

请记住将所有项目从.NET Framework v2.0升级到.NET Framework 4 Client Profile并添加using System.Linq;,以使其与当前项目一起使用.

  • 我在 [Bitbucket](https://bitbucket.org/christianjunk/bindinglistview) 上分叉了 BindingListView 并实施了您建议的更改。谢谢@RickSladkey (2认同)