Включение LINQ для BindingListView <T> - PullRequest
5 голосов
/ 06 июня 2011

Эндрю Дэвис создал отличный маленький класс для sourceforge под названием BindingListView<T>, который, по сути, позволяет связать коллекцию с DataGridView, поддерживая сортировку и фильтрацию. Привязка DataGridView к обычному List<T> не поддерживает сортировку и фильтрацию, поскольку надлежащие интерфейсы не реализуются List<T>.

Класс отлично работает и решил мои проблемы с пользовательским интерфейсом. Тем не менее, было бы замечательно, если бы я мог перебирать коллекцию с помощью LINQ, но я просто не уверен, как настроить ее для этого. Исходный код можно скачать здесь . Кто-нибудь может мне помочь?

Ответы [ 2 ]

7 голосов
/ 06 июня 2011

Поскольку проект 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>

, а затем внедрите его в конце определения класса:

#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

, и теперь вы можете использовать LINQ непосредственно на BindingListView<T> экземпляр, подобный следующему:

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

Не забудьте обновить все проекты с .NET Framework v2.0 до .NET Framework 4 Client Profile и добавить using System.Linq;, чтобы это работало с вашим текущим проектом.

1 голос
/ 06 июня 2011

Хорошо, это то, что я получил: Вот мой метод расширения:

public static class BindingViewListExtensions
{
  public static void Where<T>(this BindingListView<T> list, Func<T, bool> function)
  {
    // I am not sure I like this, but we know it is a List<T>
    var lists = list.DataSource as List<T>;

    foreach (var item in lists.Where<T>(function))
    {
        Console.WriteLine("I got item {0}", item);
    }
  }

}

А потом я использовал его как:

    List<string> source = new List<string>() { "One", "Two", "Thre" };

    BindingListView<string> binding = new BindingListView<string>(source);

    binding.Where<string>(xx => xx == "One");

Я думаю,где в методе расширения может быть возвращен найденный элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...