Как удалить дубликаты из ICollectionView с помощью FilterEventArgs MVVM

У меня есть два свойства в моей модели Vehicle: Category и Name.

У меня есть ICollectionView с именем VehiclesView.

При привязке к Category ListView отображает:

Airplane
Helicopter
Helicopter
Airplane
Car
Car

Я должен иметь возможность фильтровать VehiclesView, чтобы удалить дубликаты одного и того же Category, что приведет к:

Airplane
Car
Helicopter

Требование: логика фильтрации должна использовать FilterEventArgs, например:

 public void ApplyFilter(object sender, FilterEventArgs e)
    {
        Vehicle v = e.Item as Vehicle;
        if (v != null)
        {
            // Remove duplicate instances of Category
            if (??????????????)
            {
                e.Accepted = false;
            }
            else
            {
                e.Accepted = true;
            }
        }
    }

Мне нужна помощь только с логикой фильтрации.

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ 1: «Категория» определяется пользователем, что означает, что фильтр должен сравнивать значения свойств во время выполнения и удалять дубликаты.

РЕДАКТИРОВАТЬ 2: добавлены ссылки на все выполненные исследования, ни одно из которых не обеспечивает требуемую мне логику фильтра, но предлагает другие типы логики фильтрации и общую картину того, как реализовать фильтрацию/сортировку/группировку.

https://weblogs.asp.net/monikadyrda/wpf-listcollectionview-for-sorting-filtering-and-grouping

http://wpftutorial.net/DataViews.html

C# - как получить отдельные элементы из коллекции Просмотр

https://social.technet.microsoft.com/wiki/contents/articles/26673.wpf-collectionview-tips.aspx

http://www.abhisheksur.com/2010/08/woring-with-icollectionviewsource-in.html

Реализация фильтра ListView с демонстрацией WPF MVVM Джоша Смита Приложение

http://www.codewrecks.com/blog/index.php/2011/02/23/filtering-in-mvvm-architecture/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A%20AlkampferEng%20%28Alkampfer%27s%20Place%29&utm_content=Google%20Reader


person Slip    schedule 27.09.2020    source источник
comment
Это WPF? UWP? Какой фреймворк вы используете? Кроме того, почему вы должны использовать FilterEventArgs?   -  person Corentin Pane    schedule 27.09.2020
comment
Отвечает ли это на ваш вопрос? Фильтрация повторяющихся записей в ICollectionView   -  person Corentin Pane    schedule 27.09.2020
comment
@CorentinPane Спасибо за ответ. Я использую WPF с MVVM. FilterEventArgs лучше всего подходит для решения, которое мне нужно. У меня красная ссылка, которую вы предоставили, и она не дает решения, поскольку Category в моем случае определяется пользователем.   -  person Slip    schedule 27.09.2020
comment
comment
@Энди Спасибо за ответ, Энди. Я читал эту статью и несколько других. Они предлагают общую картину, и это здорово, но они не отвечают на мой вопрос. Мне требуется только логика фильтра для удаления дубликатов.   -  person Slip    schedule 27.09.2020
comment
Иногда вы получаете только концепцию. Как хороший разработчик, вы должны быть в состоянии разработать решение, основанное на этой концепции. Разработчик не является мастером копирования и вставки. Бывают случаи, когда вашего решения не существует или оно кем-то не опубликовано.   -  person BionicCode    schedule 28.09.2020
comment
@Slip Ссылка, которую я разместил, относится к части статьи, в которой показано, как код сравнивает каждую запись с предыдущей и дает вам одну запись на каждый уровень. Что, по общему признанию, не вырезано и вставлено, а скорее более конкретно, чем просто общая картина. Он полагается на порядок записей без использования словаря или хеш-таблицы.   -  person Andy    schedule 28.09.2020


Ответы (1)


Вы можете создать таблицу поиска:

private HashSet<object> ExistingItemsTable { get; } = new HashSet<object>();
private void ApplyFilter(object sender, FilterEventArgs e)
{
  if (this.ExistingItemsTable.Contains(e.Item))
  {
    // FilterEventArgs.Accepted is true by default
    e.Accepted = false;
    return;
  }

  this.ExistingItemsTable.Add(e.Item);
}

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

person BionicCode    schedule 28.09.2020
comment
Вы можете использовать только HashSet, а не словарь. Хэш-набор — это то, с чем разработчики сталкиваются относительно редко, и это просто ключи и все, что вам нужно для идентификации категории, которая уже была замечена. - person Andy; 28.09.2020
comment
@Энди Спасибо за предложенное улучшение. Я обновил пример, чтобы заменить Dictionary. - person BionicCode; 28.09.2020